简体   繁体   English

自托管 ASP.NET Web API 时未找到 404,在 IIS 中工作正常

[英]404 not found when self hosting ASP.NET Web API, works fine within IIS

I'm currently stuck with a self-hosted Web API I'm trying to use within a unit test.我目前被困在我试图在单元测试中使用的自托管 Web API。

Whatever route I try, I get a 404 not found error.无论我尝试什么路线,我都会收到 404 not found 错误。 The issue is, when hosting the very same Web API within IIS, everything works fine.问题是,在 IIS 中托管相同的 Web API 时,一切正常。 I'm guessing it's a simple typo/mistake in my test config, but I can't make it work, any help appreciated.我猜这是我的测试配置中的一个简单的错字/错误,但我无法使它工作,任何帮助表示赞赏。

Here's the fully working config I used for my Web API when hosted within IIS:这是我在 IIS 中托管时用于 Web API 的完整工作配置

public class WebApiApplication : System.Web.HttpApplication
{
    /// <summary>
    /// Entry point of the application.
    /// </summary>
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    }
}

public static void Register(HttpConfiguration config)
{
    // IoC configuration
    var container = new UnityContainer();
    UnityContainerConfigurator.Configure(container, new PerRequestLifetimeManager());

    // Set the dep resolver
    config.DependencyResolver = new UnityDependencyResolver(container);

    // Web API routes
    config.MapHttpAttributeRoutes();

    // Only supports JSON formatter
    config.Formatters.Clear();
    config.Formatters.Add(new JsonMediaTypeFormatter());
    config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create();

    config.Routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{action}/{id}",
        defaults: new { id = RouteParameter.Optional });

    // Custom filter
    var providers = config.Services.GetFilterProviders().ToList();
    var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider);
    config.Services.Remove(typeof(IFilterProvider), defaultprovider);
    config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(container));
}

Here's the non-working config I'm using for my unit test:这是我用于单元测试的非工作配置

var config = new HttpSelfHostConfiguration(webApiURL);

#if DEBUG
    // For debug purposes
    config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;
#endif

// Web API routes
config.MapHttpAttributeRoutes();

// Only supports JSON formatter
config.Formatters.Clear();
config.Formatters.Add(new JsonMediaTypeFormatter());
config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create();

config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional });

// Custom filter
var providers = config.Services.GetFilterProviders().ToList();
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider);
config.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider);
config.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new UnityFilterProvider(this.UnityContainer));

// Overwrites the IoC configuration
config.DependencyResolver = new UnityDependencyResolver(this.UnityContainer);

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

this.webApiServer = new HttpSelfHostServer(config);
this.webApiServer.OpenAsync().Wait();
enter code here

I also tried the new Owin hosting services, same result:我还尝试了新的 Owin 托管服务,结果相同:

public class Startup
{
    private static IUnityContainer container;

    /// <summary>
    /// Overwrites the IoC configuration.
    /// </summary>
    /// <param name="container">The container.</param>
    public static void ConfigureIoC(IUnityContainer container)
    {
        Startup.container = container;
    }

    /// <summary>
    /// This code configures Web API. The Startup class is specified as a type
    /// parameter in the WebApp.Start method.
    /// </summary>
    /// <param name="appBuilder">The application builder.</param>
    public void Configuration(IAppBuilder appBuilder)
    {
        if (Startup.container == null)
        {
            throw new Exception("Call ConfigureIoC first");
        }

        // Configure Web API for self-host.
        HttpConfiguration config = new HttpConfiguration();
        config.Routes.MapHttpRoute(
              name: "DefaultApi",
              routeTemplate: "api/{controller}/{action}/{id}",
              defaults: new { id = RouteParameter.Optional });

        // Web API routes
        config.MapHttpAttributeRoutes();

        // Only supports JSON formatter
        config.Formatters.Clear();
        config.Formatters.Add(new JsonMediaTypeFormatter());
        config.Formatters.JsonFormatter.SerializerSettings = CustomJsonSerializerSettings.Create();

        // Custom filter
        var providers = config.Services.GetFilterProviders().ToList();
        var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider);
        config.Services.Remove(typeof(System.Web.Http.Filters.IFilterProvider), defaultprovider);
        config.Services.Add(typeof(System.Web.Http.Filters.IFilterProvider), new UnityFilterProvider(container));

        // Overwrites the IoC configuration
        config.DependencyResolver = new UnityDependencyResolver(Startup.container);

        appBuilder.UseWebApi(config);
    }
}

The very same REST request I'm starting with Postman is a success when hosted within IIS, and a 404 when hosted within my unit test as a self hosted service.我从 Postman 开始的相同 REST 请求在 IIS 中托管时是成功的,而在我的单元测试中作为自托管服务托管时则是 404。

Any hint?任何提示?

You should check whether your self hosting application contains a Virtual Directory (like IIS).您应该检查您的自托管应用程序是否包含虚拟目录(如 IIS)。 And as you mentioned ensure the base path is valid.正如您所提到的,确保基本路径有效。

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

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