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 - 不允许发布方法

(API) Laravel 7 上不允许使用 tymon/jwt-auth 的 405 方法

为啥我的 Web API 对所有内容都返回 405?

405 方法不允许 - ASP.NET Web API

MVC-Web API:不允许使用 405 方法