【问题标题】:WebAPI routing: Combining Attributes and HttpConfiguration settingsWebAPI 路由:结合属性和 HttpConfiguration 设置
【发布时间】:2016-12-06 12:21:41
【问题描述】:

我正在尝试为同一条路线设置GETPOST

我已经注册了以下内容:

  config.MapHttpAttributeRoutes();

  config.Routes.MapHttpRoute(
                name: "MyGetMethod",
                routeTemplate: "api/v1/users/{user}",
                defaults: new
                              {
                                  controller = "Users",
                                  action = "MyGetMethod"
                              },
                constraints: null,
                handler: HttpClientFactory.CreatePipeline(
                    new HttpControllerDispatcher(config),
                    routeHandlerFactory.Create()));

  config.Routes.MapHttpRoute(
                name: "MySetMethod",
                routeTemplate: "api/v1/users/{user}",
                defaults: new
                              {
                                  controller = "Users",
                                  action = "MySetMethod"
                              },
                constraints: null,
                handler: HttpClientFactory.CreatePipeline(
                    new HttpControllerDispatcher(config),
                    routeHandlerFactory.Create()));

我的UsersController.cs 包含:

 [HttpPost]
    public HttpResponseMessage MySetMethod(string user)
    {
        return new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }


 [HttpGet]
    public HttpResponseMessage MyGetMethod(string user)
    {
        return new HttpResponseMessage(HttpStatusCode.NotImplemented);
    }

这不起作用。 GET 工作正常,但是当我使用 POST 时,WebAPI 仍然重定向到 GET 方法,我收到错误:

"Message": "请求的资源不支持http方式 '发布'。”

如果我注释掉GET 方法的注册,那么POST 工作正常。

是因为我在控制器方法上使用了属性[HttpPost][HttpGet] 之间的组合,而不是将它们标记为constraints

如何让GETPOST 在同一条路线上?

【问题讨论】:

  • 用一种方法检查if (HttpContext.Current.Request.HttpMethod == "POST")怎么样?

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


【解决方案1】:

如果你使用它会工作

config.MapHttpAttributeRoutes();

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

【讨论】:

【解决方案2】:

您只需要为此定义一个 HttpRoute,请试试这个:

 config.Routes.MapHttpRoute(
                name: "UserController",
                routeTemplate: "api/v1/users/{user}",
                defaults: new { user= RouteParameter.Optional }
                handler: HttpClientFactory.CreatePipeline(
                    new HttpControllerDispatcher(config),
                    routeHandlerFactory.Create()));

如果这仍然不起作用,请尝试相同的代码,但将 routeTemplate 更改为:

routeTemplate: "api/v1/{controller}/{user}"

并使用 post 调用 web 方法

https://YourServer/YourVirtualDirectory/api/v1/Users/myUser

【讨论】:

  • 我也试过这样,结果还是一样:(..如果我从控制器方法中移动 HttpPost 和 HttpGet 属性并将它们作为约束它工作正常。但为什么我不能使用属性?
  • 您是否可以选择使用 AttributeRouting 而不是基于约定的路由?我强烈推荐。如果是,我会把答案发给你。
  • 你还有一个类型在第二个参数(HttRequestMessage)中缺少一个'p'
  • 不能使用属性路由
  • 根据您的评论编辑了问题,删除了 HttpRequestMessage
猜你喜欢
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
  • 2018-01-14
  • 2014-06-14
  • 1970-01-01
相关资源
最近更新 更多