C# Web API 405 方法没有路由到我的 PUT,总是点击我的 GET
Posted
技术标签:
【中文标题】C# Web API 405 方法没有路由到我的 PUT,总是点击我的 GET【英文标题】:C# Web API 405 method not routing to my PUT, always hitting my GET 【发布时间】:2016-04-24 07:33:36 【问题描述】:我已经使用 Web API 一年多了,之前还没有遇到过这个问题。在花了几个小时在谷歌上搜索,查看堆栈溢出帖子等之后,我真的是束手无策。我想知道我是否只是在做一些大脑放屁的事情。
我有一个控制器,我想要一个 get 和 put 反对同一条路线:
[Route("api/strings")]
[HttpGet]
public IHttpActionResult GetStrings()
try
var siteStrings = svc.GetSiteStrings(_appId);
return Ok(new strings = siteStrings );
catch(Exception)
return InternalServerError();
[HttpPut]
[AcceptVerbs("PUT")]
[Route("api/strings")]
public IHttpActionResult PutString(String key, String text)
//TODO: add authorization to this one.
try
if (svc.UpdateString(key, text, _appId))
return Ok();
return InternalServerError();
catch (Exception)
return InternalServerError();
我的路由只是默认的开箱即用路由,如下所示:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/controller/id",
defaults: new id = RouteParameter.Optional
);
在基于关于 405 错误的许多其他堆栈溢出问题一遍又一遍地进行配置之后,我意识到我可以验证我的 PUT 方法是否正在尝试将我的 PUT 方法路由到我的 GET 端点。但是,如果我将 put 上的路线更改为其他内容,我总是会得到 404。我无法弄清楚为什么它将我所有的 put 或 post 都放在我的 GET 动词上,从而说我的操作是不允许的路线。我确信此时我只是错过了一些微不足道的事情,但精神疲劳和疲惫的眼睛只是让我退缩。有人看到我做错了什么愚蠢的事情吗?
【问题讨论】:
可能是这种情况(我猜就是这样):您将第一个版本的 api(仅使用 GET)部署到服务器 1。然后您添加了 PUT 方法并将更新的方法部署到服务器 2 . 但是在您的测试中,网络浏览器连接到服务器 1。 这只是在我的本地开发笔记本电脑上使用 IIS express 运行时发生的。我的问题是我没有意识到 PUT 和 POST 只会从请求正文中填充一个参数。一旦我输入了一个复杂类型(我自己的与传入请求正文匹配的类定义),路由就会成功并到达 PUT。奇怪的是,如果它不能在 PUT 上很好地模型绑定,它会退回到 get 上的路由。 【参考方案1】:我所要做的就是创建一个类,我的 put 必须对绑定模型而不是两个参数进行建模,然后路由开始工作。这令人惊讶,但我只需要执行以下操作即可:
public class temp
public String key get; set;
public String text get; set;
[HttpPut]
[AcceptVerbs("PUT")]
[Route("api/strings/")]
public IHttpActionResult PutString(temp data)
//TODO: add authorization to this one.
try
if (svc.UpdateString(data.key, data.text, _appId))
return Ok();
return InternalServerError();
catch (Exception)
return InternalServerError();
显然,我不会将那个 temp 类保留在那里,但它是在黑暗中快速刺探看 put 是否会以这种方式正确路由。果然做到了。一定是我不知道的 Web API 模型绑定规范中的内容。
【讨论】:
以上是关于C# Web API 405 方法没有路由到我的 PUT,总是点击我的 GET的主要内容,如果未能解决你的问题,请参考以下文章
从 POSTMAN 到我的 java api 的 POST 上的 405 响应代码
AngularJS、REST、C# 服务、405 - 不允许发布方法