【问题标题】:Routes and the dreaded 405路线和可怕的 405
【发布时间】:2018-08-23 12:37:12
【问题描述】:

我有一个简单的 Web API,它在一个路由上注册。目前我有两个,因为其中只有一个可以满足我的需要。

我的应用程序只有一个控制器和该控制器中的一个 Post 方法。我已经注册了一个总是返回 405 (method not allowed)

的 Route

两条路由在RouteConfig.cs中配置:

routes.MapHttpRoute(
    name: "app-events",
    routeTemplate: "events",
    defaults: new { controller = "Events" },
    handler: new GZipToJsonHandler(GlobalConfiguration.Configuration),
    constraints: null
);

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

Controller方法本质上是这样的……

public class EventsController : ApiController
{
    public EventsController()
    {
        _sender = new EventHubSender();
    }

    public async Task<HttpResponseMessage> Post(HttpRequestMessage requestMessage)
    {
        // doing fun stuff here…

       return new HttpResponseMessage(HttpStatusCode.OK);
    }
}

如果我只配置第一个路由并将请求发布到 http://devbox/events,我将得到 405。但是,如果我添加第二个默认路由并发布到 @ 987654325@ 我得到了预期的201

两个路由同时配置,模式相同,显式绑定到控制器的路由收到一个发布请求并失败并返回 405,但另一个 URL 可以工作。

在承认提出这个问题之前,我花了很长时间环顾四周。我读到的大多数东西都与 Webdav 有很大关系,我想我已经按照它们中的每一个来解决这个问题。我对这个堆栈不是很有经验,所以对我来说没有什么是很明显的。

【问题讨论】:

    标签: c# asp.net-web-api asp.net-web-api-routing


    【解决方案1】:

    您提到了RouteConfig 文件。这用于配置 MVC 路由而不是 Web API 路由。

    因此,您似乎配置了错误的文件,这可以解释为什么 api/... 路径有效,因为它可能映射到 WebApiConfig.Register 中的默认配置,看起来像

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            // Convention-based routing.
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    您需要使用其他所需路线更新该文件

    public static class WebApiConfig {
        public static void Register(HttpConfiguration config) {
            // Convention-based routing.
            config.Routes.MapHttpRoute(
                name: "app-events",
                routeTemplate: "events",
                defaults: new { controller = "Events" },
                handler: new GZipToJsonHandler(GlobalConfiguration.Configuration),
                constraints: null
            );
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
        }
    }
    

    Web API 路由通常在 MVC 路由之前注册,这解释了为什么它不适用于您的原始配置。

    您还应该使用相应的Http{Verb} 属性来装饰动作。

    在这种情况下HttpPost 以便路由表知道如何处理与路由模板匹配的 POST 请求。

    [HttpPost]
    public async Task<IHttpActionResult> Post() {
        var requestMessage = this.Request;
    
        // async doing fun stuff here….
    
       return OK();
    }
    

    【讨论】:

    • 感谢您的建议,不幸的是,这并没有奏效。理想情况下,我希望该服务只有一个发布方法可用,但如果我将它隔离到一个发布路线,我会得到 405。这是一个常见的建议,在某些情况下有效,但不适用于我的。
    • @bravelad 想通了。您设置了错误的路由集合。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 2012-04-19
    • 2013-11-18
    • 2016-01-20
    • 2015-06-01
    相关资源
    最近更新 更多