【问题标题】:Web API - 405 - The requested resource does not support http method 'PUT'Web API - 405 - 请求的资源不支持 http 方法“PUT”
【发布时间】:2014-06-23 12:13:38
【问题描述】:

我有一个 Web API 项目,我无法针对它启用“PUT/Patch”请求。

我从提琴手那里得到的回应是:


HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Allow: GET,POST,DELETE
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?QzpcUHJvamVjdHNcZG90TmV0XFdlYkFQSVxBZFNlcnZpY2VcQWRTZXJ2aWNlXGFwaVxpbXByZXNzaW9uXDE1?=
X-Powered-By: ASP.NET
Date: Tue, 06 May 2014 14:10:35 GMT
Content-Length: 72

{"message":"The requested resource does not support http method 'PUT'."}

根据以上回复,“PUT”动词不被接受。但是,我无法弄清楚相关处理程序的配置位置。

类的“Put”方法声明如下:

[HttpPatch]
[HttpPut]
public HttpResponseMessage Put(Int32 aID, [FromBody] ImpressionModel impressionModel)
{
     bla, bla, bla, bla
}

我已阅读并实施了以下线程中解释的更改: - Asp.NET Web API - 405 - HTTP verb used to access this page is not allowed - how to set handler mappings - http://www.asp.net/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications

当我尝试对我的 Web API 项目发出“PUT”命令时,仍然收到 405 响应,因此没有任何效果。

我什至注释掉了 ApplicationsHost.config 文件中的所有“处理程序”。

使用 VS2012 Premium 和 IIS Express(我假设它是版本 8)。我也尝试了 VS 开发服务器,但这也给了我相同的结果。

我没有想法。任何帮助将不胜感激。

谢谢李

【问题讨论】:

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


    【解决方案1】:

    你在使用属性路由吗?

    这个神秘的错误是一个路由属性问题。这在您的 WebAPIConfig 中启用为:

     config.MapHttpAttributeRoutes(); 
    

    事实证明,Web Api 控制器“不能同时托管基于动词的操作方法和传统的操作名称路由。”; https://aspnetwebstack.codeplex.com/workitem/184

    简而言之:我需要在我的 API 控制器中使用 [Route] 属性标记我的所有操作,否则当尝试通过传统路由定位它时,该操作是“隐藏的”(405'd)。

    API 控制器:

    [RoutePrefix("api/quotes")]
    public class QuotesController : ApiController
    {
        ...
    
        // POST api/Quote
        [ResponseType(typeof(Quote))]
        [Route]
        public IHttpActionResult PostQuote(Quote quote)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }
    
            db.Quotes.Add(quote);
            db.SaveChanges();
    
            return CreatedAtRoute("", new { id = quote.QuoteId }, quote);
        }
    

    注意:我的 Route 未命名,因此 CreatedAtRoute() 名称只是一个空字符串。

    WebApiConfig.cs:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API configuration and services
            config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
    
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
        }
    }
    

    希望对你有帮助

    【讨论】:

    • 对我来说也很不幸。这是同样的问题。
    • +1 用于提供 CodePlex 中报告的问题的链接。此外,您可能会找到 2 个不同的链接以获取可能的解决方法。由于问题在没有修复的情况下关闭,我更愿意在没有任何解决方法的情况下对其进行管理,以避免过度设计我的 Web API ;)
    • 谢谢!在 PUT 和 POST 上添加 [Route](它在那里丢失)解决了我的问题。最后,关于 web api 路由的重要信息!
    【解决方案2】:

    我遇到了与您完全相同的问题,我尝试了您尝试过的所有方法,但有时解决方案是如此微不足道且在您的眼皮底下,以至于您根本没想到它并继续寻找更复杂的原因。确保在您调用以测试 Web 方法的 url 中,参数名称与控制器方法声明中的名称匹配。我的 405 问题只需这样做就解决了(我使用的是查询参数):

    我的客户控制器:

    ...
    
    [HttpPut]
    public string PutClient(string username = "", string phone= ""){...}
    

    在我的 WebApiConfig 上:

    // Web API routes
    config.MapHttpAttributeRoutes();
    
    config.Routes.MapHttpRoute(
         name: "DefaultApi",
         routeTemplate: "api/{controller}"
    );
    

    并且用于测试方法的路径必须是这样的:(使用 Postman 或类似的,以应用正确的 web 方法)

    http://localhost:49216/api/clients?username=Kurt&phone=443332211
    

    否则,您将在该控制器中为该 http 方法获得 405。我根本不需要更改 web.config(不需要删除 webdav 等)。在文档中查看this 的源代码:

    例如,考虑以下操作:

    公共无效获取(int id)

    id 参数绑定到 URI。所以, 此操作只能匹配包含“id”值的 URI, 在路由字典或查询字符串中。

    可选参数是一个例外,因为它们是可选的。为了 一个可选参数,如果绑定无法从中获取值也没关系 URI。

    【讨论】:

    • 这里也一样。传递了错误的参数名称并挠了我一个小时!
    【解决方案3】:

    当我更改 PUT 方法的第一个参数名称时发生这种情况

    public void Put(int code, [FromBody]Lead lead)
    

    应该是:

    public void Put(int id, [FromBody]Lead lead)
    

    这就是它的调用方式:

    $.ajax({
        type: "PUT",
        data: json,
        url: "../api/leadsapi/123",
        contentType: "application/json; charset=utf-8"
    });
    

    【讨论】:

      【解决方案4】:

      对我来说,正如许多其他海报所声称的那样。您可能在 webapiconfig 中正确设置了所有内容,但是您只是错过了一些愚蠢的东西。

      就我而言,我的路线定义为:

      [HttpPut]
          [Route("api/MilestonePut/{Milestone_ID}")]
          public void Put(int id, [FromBody]Milestone milestone)
          {
              db.Entry(milestone).State = System.Data.Entity.EntityState.Modified;
              db.SaveChanges();
          }
      

      看到问题了吗?该参数在路由中定义为 Milestone_ID,但在函数本身中定义为 id。你会认为 .NET 会足够聪明地实现这一点,但它肯定不会也不会工作。

      一旦我将其更改为匹配参数,如下所示:

      [HttpPut]
          [Route("api/MilestonePut/{id}")]
          public void Put(int id, [FromBody]Milestone milestone)
          {
              db.Entry(milestone).State = System.Data.Entity.EntityState.Modified;
              db.SaveChanges();
          }
      

      一切都像魅力一样。

      【讨论】:

        【解决方案5】:

        如果您忘记公开 API 控制器上的 Put() 方法,这也是返回的错误消息。事后看来这很明显,但让我头疼了十分钟。

        【讨论】:

          【解决方案6】:

          遇到同样的问题,我需要做 3 件事来解决这个问题:

          1. <modules><handlers> 中禁用Webdav
          2. 使用 WebAPI 时确保 HttpPut 来自 System.Web.Http 而不是来自 System.Web.Mvc
          3. 像这样启用 ExtensionlessUrlHandler

          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />

          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />

          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />

          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />

          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />

          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

          希望这可以帮助你们中的一些人解决这个令人讨厌的问题...

          【讨论】:

            【解决方案7】:

            这个答案为我解决了这个问题。我不得不添加 Route 属性,问题就解决了。

                [HttpPut]
                [Route("")]
                public HttpResponseMessage MyMethod()
            

            【讨论】:

            • 我尝试了您的解决方案,但结果相同。
            【解决方案8】:

            您应该在您的网络服务器配置中配置它。这取决于您可以在哪里执行此操作的网络服务器的类型。例如,通过 IIS,您可以在文档根目录中使用 web.config 文件来执行此操作。通过跨域请求,您必须将 CORS 标头添加到响应中,以允许来源、方法等...

            注意:也许您也可以使用 ASP.NET 框架来解决这个问题,但我认为它不同。

            【讨论】:

              【解决方案9】:

              在 web.config 的 Handler 部分下添加以下部分:

              <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
              

              例如:

              <handlers>
                  <remove name="WebDAV" />
                  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
                  <remove name="OPTIONSVerbHandler" />
                  <remove name="TRACEVerbHandler" />
                  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,POST,PUT,PATCH,MERGE" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
              </handlers>
              

              【讨论】:

                【解决方案10】:

                现在可能已经晚了,但有人可以使用它。

                我想使用 PUT 请求,我只是将字符串化对象发送到 web api,而 put 方法只接受该对象。

                JQUERY

                let musterija = {
                            Name: name,
                            Email: email,
                            Password: password,
                            Username: logUser.Username,
                            Lastname: lastname,
                            GenderString: gender,
                            Jmbg: identification,
                            PhoneNumber: phone,
                        };
                
                        $.ajax({
                            method: "PUT",
                            url: "/api/Musterija",
                            data: JSON.stringify(musterija),
                            contentType: "application/json; charset=utf-8",
                            dataType: "json",
                            success: function () {
                                alert("Entity updated");
                                EmptyAllInputs();
                                $('#divprofile').show();
                                $('#divupdate').hide();
                            },
                            error: function (msg) {
                                alert("Fail - " + msg.responseText);
                            }
                        });
                

                WEB API

                    [HttpPut]
                    public HttpResponseMessage PutMusterija(Musterija m)
                

                【讨论】:

                  猜你喜欢
                  • 2017-04-24
                  • 2018-03-21
                  • 1970-01-01
                  • 2013-03-19
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-03-05
                  • 2016-05-24
                  相关资源
                  最近更新 更多