Использование WebAPI 2.2 внутри существующего проекта ASP.NET MVC 5

Я использую WebAPI 2.2 с маршрутизацией атрибутов внутри существующего проекта MVC 5. Я намерен перенести весь веб-сайт в WebAPI, но это займет некоторое время. У меня все работает, но я обеспокоен, что могу делать что-то не так.

Похоже, этот пост SO предлагает мне вызвать GlobalConfiguration.Configure(WebApiConfig.Register) в файле Global.asax.cs.

Если я просто удаляю аргумент HttpConfiguration, обычно предоставляемый в WebApiConfig.Register()и просто позвони GlobalConfiguration.Configure(x => x.MapHttpAttributeRoutes()) в пределах WebApiConfig.Register() Метод - конечные точки 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());
    }
}

Что-то не так с этим подходом?

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),

Логически следует, что они должны давать тот же результат. Вот код Microsoft для GlobalConfiguration в пространстве имен System.Web.Http:

/// <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
}
Другие вопросы по тегам