【问题标题】:WebAPI Attribute Routing Not Working in OWINWebAPI 属性路由在 OWIN 中不起作用
【发布时间】:2017-04-09 14:02:50
【问题描述】:

我遇到了 WebApi 为我的路由抛出 404 错误的问题。控制器的一个例子是:

[System.Web.Http.RoutePrefix("test/categories")]
public class CategoriesController : ControllerBase
{

    [System.Web.Http.Route("hello")]
    [HttpGet]
    [AcceptVerbs("GET")]
    public IHttpActionResult Get([FromUri] QueryOptions options)
    {
        // Usual controller stuff happens here
    }

    [System.Web.Http.Route("{id:int}")]
    [HttpGet]
    [AcceptVerbs("GET")]
    public IHttpActionResult GetById(int id)
    {
        // Usual controller stuff happens here
    }
}

https://api.testdomain.com/test/categories/hellohttps://api.testdomain.com/test/categories/1 的GET 请求都抛出404 Not Found 错误。该应用程序在 IIS(不是 IIS Express)上运行。 404 是 IIS 404,表示应用正在启动,但路由失败。我在startup.cs 中附加了断点,它肯定会被命中。

我的startup.cs 文件包含:

    public void Configuration(IAppBuilder app)
    {            
        var config = new HttpConfiguration
        {
            IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always,
            DependencyResolver = new SimpleInjectorWebApiDependencyResolver(_container) // _container is a SimpleInjector IoC container; shouldn't affect things.
        };

        WebApiConfig.Register(config);

        app.UseCors(CorsOptions.AllowAll);
        app.UseWebApi(config); // Have tried commenting this out with no luck
    }

我的global.asax 包含:

    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configure(WebApiConfig.Register); // Have also tried commenting this out with no luck
    }

WebApiConfig.cs 看起来像这样:

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

        config.Formatters.Add(new FilePropertyInfoMediaTypeFormatter());

    }
}

我安装了以下软件包:

<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Cors" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.Owin" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net452" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net452" />

我不知道为什么路由不起作用。它是从其他项目移植的代码,方法(即startup.cs等中的代码)与工作项目相同。

我在兜圈子,所以任何帮助都非常感激。

【问题讨论】:

  • Register 方法中的默认路由在哪里?类似config.Routes.MapHttpRoute(name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });
  • 您是否已将 ExtensionlessUrlHandler 添加到 web.config 中的处理程序部分?这是一个示例:stackoverflow.com/questions/9703090/…
  • @RaviA。它使用属性路由,所以不需要你写的默认路由
  • 我的坏人没有仔细查看 URL。所以这可以在带有 IIS Express 的 Visual Studio 中按预期工作吗?您也可以尝试从 startup.cs 中删除这一行 WebApiConfig.Register(config); ,因为您已经在 global.asax 中这样做了
  • @Schadensbegrenzer ExtensionlessUrlHandler 已添加

标签: asp.net asp.net-web-api asp.net-web-api2 owin


【解决方案1】:

您正在将 HttpConfiguration 对象的配置与 IIS 和 OWIN 混淆。它是一个或另一个。两者同时使用会导致冲突。

WebApiConfig.cs

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

        config.Formatters.Add(new FilePropertyInfoMediaTypeFormatter());

        config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always;

        config.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(_container);
    }
}

Startup.cs

public class Startup {
    public void Configuration(IAppBuilder app) {  
        app.UseCors(CorsOptions.AllowAll);
    }
}

Global.asax 保持不变

protected void Application_Start(object sender, EventArgs e) {
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

【讨论】:

    猜你喜欢
    • 2014-03-25
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-06-10
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多