Asp.net web api C#Web API 405方法不路由到我的PUT,总是命中我的GET
我使用Web API已经一年多了,以前从未遇到过这个问题。在花了几个小时的时间在谷歌上搜索、查看堆栈溢出帖子等之后,我真的是不知所措了。我想知道我是不是脑子里出了个屁 我有一个控制器,我希望在同一路线上进行get和put:Asp.net web api C#Web API 405方法不路由到我的PUT,总是命中我的GET,asp.net-web-api,put,asp.net-routing,http-status-code-405,Asp.net Web Api,Put,Asp.net Routing,Http Status Code 405,我使用Web API已经一年多了,以前从未遇到过这个问题。在花了几个小时的时间在谷歌上搜索、查看堆栈溢出帖子等之后,我真的是不知所措了。我想知道我是不是脑子里出了个屁 我有一个控制器,我希望在同一路线上进行get和put: [Route("api/strings")] [HttpGet] public IHttpActionResult GetStrings() { try { var siteStrings = s
[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方法路由到GET的端点。然而,如果我把我的线路改成其他线路,我总是会得到404。我不明白为什么它会把我所有的put或post都放到GET动词上,从而说这个动作在我的路线上是不允许的。我确信我在这一点上错过了一些琐碎的事情,但精神疲劳和疲惫的眼睛却让我望而却步。有人看到我做错了什么蠢事吗?我所要做的就是创建一个类,我的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();
}
}
很明显,我不会保留那个临时类,但这是一个快速的暗中测试,看看put是否会以这种方式正确路由。果然是这样。一定是Web API的模型绑定规范中有我不知道的东西。可能是这种情况(我猜是这样):您将API的第一个版本(仅限GET)部署到了服务器1。然后添加了PUT方法,并将更新后的方法部署到服务器2。但在您的测试中,web浏览器连接到服务器1。这一切都是在我的本地开发笔记本电脑上使用IIS express运行时发生的。我的问题是,我没有意识到PUT和POST只会填充请求体中的一个参数。一旦我输入了一个复杂类型(我自己的类定义与传入的请求体相匹配),路由就完成了并到达了put。奇怪的是,如果它不能在PUT上很好地进行模型绑定,它就会回到get上的路由。