繁体   English   中英

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

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

我目前被困在我试图在单元测试中使用的自托管 Web API。

无论我尝试什么路线,我都会收到 404 not found 错误。 问题是,在 IIS 中托管相同的 Web API 时,一切正常。 我猜这是我的测试配置中的一个简单的错字/错误,但我无法使它工作,任何帮助表示赞赏。

这是我在 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));
}

这是我用于单元测试的非工作配置

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

我还尝试了新的 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);
    }
}

我从 Postman 开始的相同 REST 请求在 IIS 中托管时是成功的,而在我的单元测试中作为自托管服务托管时则是 404。

任何提示?

您应该检查您的自托管应用程序是否包含虚拟目录(如 IIS)。 正如您所提到的,确保基本路径有效。

暂无
暂无

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

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