【问题标题】:Why does my POST request call my defined GET function?为什么我的 POST 请求会调用我定义的 GET 函数?
【发布时间】:2021-10-15 09:16:12
【问题描述】:

我正在使用 ASP.NET Web Api,并且我已经设置了一个应该同时处理 GET 和 POST 的路由。当我尝试进行 POST 调用时,它会返回此错误

Response statuscode:'405'.
Response body: {"Message":"The requested resource does not support http method 'POST'."}

所以它试图调用 GET 函数而不是我设置的 POST 函数,即使我已经单独注册了它们。

这是我的两个函数

public class EmployeeController : ApiController
{
  [System.Web.Http.HttpGet]
  public object GetApplicationFunc([FromUri]EmployeeApplicationDTO request)
  {
   //Do GET specific stuff 
  }

  [System.Web.Http.HttpPost]
  public object PostApplicationFunc([FromBody]EmployeeApplicationDTO request)
  {
   //Do totally different POST stuff
  }
}

然后这是我注册路线的方式

routes.MapHttpRoute(
name: "ApplicationGet",
routeTemplate: "application/apply",
defaults: new { controller = "Employee", action = "GetApplicationFunc"},
constraints: null);

routes.MapHttpRoute(
name: "ApplicationPost",
routeTemplate: "application/apply",
defaults: new { controller = "Employee", action = "PostApplicationFunc"},
constraints: null);

所以我指定了不同的 HTTP 路由,在同一个 'routeTemplate' 下,但只调用了“GetApplication()”,它的行为就像我的“PostApplication()”在发出 POST 请求时不存在。为什么???

【问题讨论】:

  • 第一条路线获胜(即您已经定义了两次相同的路线 - 所以它只选择其中一条而忽略另一条)。您没有通过 post/get 限制任何一条路线。 stackoverflow.com/a/18406158/34092

标签: c# asp.net-web-api routes controller webapi


【解决方案1】:

尝试用这些替换您的路线

            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

            routes.MapMvcAttributeRoutes();

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
            );

动作

public class EmployeeController : ApiController
{
   Route[("{id}"]
  public object GetApplicationFunc( int id)
  {
   //Do GET specific stuff 
  }

  public object PostApplicationFunc( EmployeeApplicationDTO request)
  {
   //Do totally different POST stuff
  }
}

假设员工Id=5 使用Get 你需要的url http//..../employee/GetApplicationFunc/5

发布 http//..../employee/PostApplicationFunc

我强烈推荐的另一种方法是使用路由属性

Route[("/Employee/GetApplication/id})"]
public object GetApplicationFunc( int id)
  {
   //Do GET specific stuff 
  }

Route[("/Employee/PostApplication")]
public object PostApplicationFunc( EmployeeApplicationDTO request)
  {
   //Do totally different POST stuff
  }

【讨论】:

  • 感谢您的回答。所以我在很多地方都见过{controller}/{action}/{id},但我的 RESTApi 有 60 多条其他路线可能不会完全遵循这个设计。这是否意味着我必须完全重新设计我的整个 RESTApi 才能符合{controller}/{action}/{id} ??
  • 我可以推荐使用属性路由。请参阅我的更新答案。最好将所有内容放在一个文件中。
猜你喜欢
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
  • 2020-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-02
相关资源
最近更新 更多