【问题标题】:Using WebAPI 2.2 inside of an existing ASP.NET MVC 5 project在现有 ASP.NET MVC 5 项目中使用 WebAPI 2.2
【发布时间】:2014-09-20 15:20:02
【问题描述】:

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

This SO post seems to suggest I should be calling GlobalConfiguration.Configure(WebApiConfig.Register) in the Global.asax.cs file

如果我简单地删除通常在 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());
    }
}

这种方法有什么问题吗?

【问题讨论】:

    标签: c# asp.net-web-api asp.net-mvc-5 asp.net-web-api2 attributerouting


    【解决方案1】:

    事实证明,当 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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-19
      • 1970-01-01
      相关资源
      最近更新 更多