繁体   English   中英

在现有的ASP.NET MVC 5项目中使用WebAPI 2.2

[英]Using WebAPI 2.2 inside of an existing ASP.NET MVC 5 project

我在现有MVC 5项目中使用带有属性路由的WebAPI 2.2。 我打算将整个网站迁移到WebAPI,但这需要一些时间。 我一切正常,但我担心自己做错了。

这样的SO帖子似乎建议我应该在Global.asax.cs文件中调用GlobalConfiguration.Configure(WebApiConfig.Register)

如果我简单地删除通常在WebApiConfig.Register()提供的HttpConfiguration参数,并仅在WebApiConfig.Register()方法内调用GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes()) ,则WebAPI端点将以所需的结果进行响应。

所以这就是我的最终结果:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}


class WebApiConfig
{
    public static void Register()
    {
        GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());
    }
}

这种方法有什么问题吗?

因此,事实证明,只有两种方法可以解决将WebAPI 2.2添加到现有项目时出现的配置问题。 我正在做两个修复程序,当我阅读代码时,这些修复程序对我来说很清楚。

下列:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}


class WebApiConfig
{
    public static void Register()
    {
        GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes());
    }
}

实际上与执行以下操作相同:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        //WebApiConfig.Register();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
}

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.MapHttpAttributeRoutes();
    }
}

看来我只是在经历精神失常:)

很显然, GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes())基本上与GlobalConfiguration.Configure(WebApiConfig.Register)做相同的事情。

从逻辑上讲,这些应该产生相同的结果。 这是System.Web.Http命名空间中GlobalConfiguration的Microsoft代码:

/// <summary>
/// Provides a global <see cref="T:System.Web.Http.HttpConfiguration"/> for ASP.NET applications.
/// </summary>
public static class GlobalConfiguration
{
    private static Lazy<HttpConfiguration> _configuration = CreateConfiguration();

    ///... code excluded for brevity

    /// <summary>
    /// Gets the global <see cref="T:System.Web.Http.HttpConfiguration"/>.
    /// </summary>
    public static HttpConfiguration Configuration
    {
        get { return _configuration.Value; }
    }

    /// <summary>
    /// Performs configuration for <see cref="GlobalConfiguration.Configuration"/> and ensures that it is
    /// initialized.
    /// </summary>
    /// <param name="configurationCallback">The callback that will perform the configuration.</param>
    public static void Configure(Action<HttpConfiguration> configurationCallback)
    {
        if (configurationCallback == null)
        {
            throw new ArgumentNullException("configurationCallback");
        }

        configurationCallback.Invoke(Configuration);
        Configuration.EnsureInitialized();
    }

    private static Lazy<HttpConfiguration> CreateConfiguration()
    {
        return new Lazy<HttpConfiguration>(() =>
        {
            HttpConfiguration config = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes));
            ServicesContainer services = config.Services;
            Contract.Assert(services != null);
            services.Replace(typeof(IAssembliesResolver), new WebHostAssembliesResolver());
            services.Replace(typeof(IHttpControllerTypeResolver), new WebHostHttpControllerTypeResolver());
            services.Replace(typeof(IHostBufferPolicySelector), new WebHostBufferPolicySelector());
            services.Replace(typeof(IExceptionHandler),
                new WebHostExceptionHandler(services.GetExceptionHandler()));
            return config;
        });
    }

    ///... code excluded for brevity
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM