WebApi(MVC 5) PUT 方法不允许使用 HTTP/1.1 405 方法

Posted

技术标签:

【中文标题】WebApi(MVC 5) PUT 方法不允许使用 HTTP/1.1 405 方法【英文标题】:HTTP/1.1 405 Method Not Allowed for WebApi(MVC 5) PUT Method 【发布时间】:2014-08-19 07:46:38 【问题描述】:

我的 android 应用程序需要将一些数据更新到服务器,我为此编写了一些 WebApi 代码,用于更新和从我的 android 应用程序发送数据。 当我在本地服务器上测试时,两者都工作正常,但在上传到全局后它不起作用并给出如下错误:(在 android 应用程序和 fidler 中测试)

HTTP/1.1 405 Method Not Allowed
Allow: GET, HEAD, OPTIONS, TRACE
Content-Type: text/html
Server: Microsoft-IIS/8.0

我在 Android 和 C# 中都使用了简单的代码:

安卓代码:

            HttpClient client  = new DefaultHttpClient();
            HttpPut post = new HttpPut(PUT_SETTINGS_DATA);
            try 
                JSONStringer vm = new JSONStringer().object().key("UserId")
                        .value(UserId).key("IsGPSOn").value(String.valueOf(isServiceOn)).endObject();
                post.setHeader("Accept", "application/json");
                post.setHeader("Content-type", "application/json");

                StringEntity entity = new StringEntity(vm.toString());
                post.setEntity(entity);
                HttpResponse response = client.execute(post);
                BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
                String vv = "";
                while((vv = br.readLine()) != null)
                    Log.v("Response Count", vv+" "+UserId);
                

             catch (JSONException e1) 
                e1.printStackTrace();
             catch (ClientProtocolException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
             catch (IOException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

WebApi 代码:

    [HttpPut]
    public int Put(SettingsVM vm)
    
        using (var db = new ApiDBContext())
        

            string sqlQry = "Select COUNT(ID) FROM Settings WHERE UserId= '" + vm.UserId + "'";
            var count = db.Database.SqlQuery<Int32>(sqlQry).SingleOrDefault();
            if (count != 0)
            
                string sql = "Update Settings Set IsGPSOn=1 where UserId=0";
                count = db.Database.ExecuteSqlCommand(sql, new object[]  vm.UserId, vm.IsGPSOn );
                db.SaveChanges();
            
            else
            
                string sql = "INSERT INTO Settings(UserId,IsGPSOn) VALUES(0,1)";
                count = db.Database.ExecuteSqlCommand(sql, new object[]  vm.UserId, vm.IsGPSOn );
                db.SaveChanges();
            
            return count;

        

    

我已经检查并测试了所有可能的解决方案来解决这个错误。但面临同样的问题。

谢谢

【问题讨论】:

【参考方案1】:

在您的 web.config 中删除 WebDAV,因此请确保将这 2 个删除,以及您已有的其他内容。

<?xml version="1.0" encoding="UTF-8"?>
<system.webServer>
    <modules>
      <remove name="WebDAVModule" />
    </modules>
    <handlers>
      <remove name="WebDAV" />
    </handlers>
</system.webServer>

如果您从 Handler Mappings 和 Modules 中删除 WebDav,您也可以从 IIS 中执行此操作(它会更改 web.config)。

[背景:我最初试图从我的服务器中完全摆脱 WebDAV,但这对于实际的 Web 应用程序(而不是 API)来说似乎是个坏消息,它似乎以某种方式依赖于 WebDAV 处理 CSS & JS 内容。所以在这里我刚刚从 WebAPI 中删除了它。我没有运气允许特定的动词 PUT,也没有“*”。无论如何,从我所看到的一切来看,WebDAV 都会在 PUT 上出现问题。]

【讨论】:

【参考方案2】:

在没有看到您的请求的情况下,我很确定您将 ID 发送为http://www.fluff.com/api/Fluff?id=MyID,而是将其发送为http://www.fluff.com/api/Fluff/MyID。

在这里查看我之前的回答: https://***.com/a/25577497/1176452

【讨论】:

【参考方案3】:

正如我从您的帖子中看到的,您使用的是IIS/8.0PUTDELETE 动词的错误 405: Method not allowed 是此环境的一个众所周知的问题。

所有证据似乎都集中在一个名为 WebDAV 的 IIS 模块的干扰上。您将需要全局卸载它或为您的项目在本地禁用它。此外,您可能需要编辑您的 applicationhost.config 文件以允许使用 PUT 动词。

如果您知道不需要WebDAV,最好完全禁用它或从 IIS 中卸载它。但是,如果您不知道您或共享您服务器的其他人是否需要它,那么最好在本地为您的项目禁用您不需要的功能,以免给其他人带来问题。

我可以在此处复制另一个 SO Q&A,或者您可以查看接受的答案 this question 以及 non-accepted answer to this question。

人们通常不赞成基于链接中包含的信息的答案,但由于它们都在 SO 中,我希望只要您的问题处于活跃状态,他们就会保持活跃。如果您发现任何有用的信息,请考虑点赞。

最后,这个(SO 外部的)link 还解释了如何从 IIS 角色和功能配置中全局卸载 WebDAV 功能。

【讨论】:

对不起..没有解决方案对我有用..所以最后我将我的方法从 put 更改为 post..thanks 很抱歉听到以上没有帮助。找出原因会很有趣,但是根据link,您可能无能为力。至少你已经启动并运行,这是主要的事情。归根结底,您需要务实并像以前一样采取解决方法。 如果您已完成上述操作但仍在为此苦苦挣扎,并且您正在使用 AttributeRouting,那么这为我解决了问题:***.com/questions/14321988/… tl;dr:AttributeRouting 中有一个错误,其中 HttpPut 请求除非您使用 [HttpPut] 显式装饰该方法,否则将被阻止。这可能已在较新的版本中得到修复,但如果您使用的是旧版本,它仍然可能会造成问题。 我从我的 Windows 7 安装中卸载了 WebDAV,它破坏了所有 CSS/JS 交付(它开始以 text/html 的形式出现,但浏览器拒绝了它)。立即重新安装WebDAV。所以...不是我理解为什么,而是为什么 WebDAV 是某些动词的问题,卸载它也不一定是一个好选择。【参考方案4】:

如果您查看来自 Web 服务器的响应,它会列出允许的动词。 PUT 不是其中之一。

编辑您的 web.config 以为您的应用程序启用 PUT。

我相信这在本地工作的原因是因为 IIS Express 和 Cassini 不强制执行动词限制。

在此处向下滚动到配置示例:http://www.iis.net/configreference/system.webserver/security/requestfiltering/verbs

【讨论】:

谢谢你的回复,但是你能解释清楚一点或者举一些例子来说明如何启用网络配置。 编辑帖子以包含示例链接。 对不起它不起作用..通过添加这些句子,我的其他方法停止工作.. 只需添加所有你需要的动词

以上是关于WebApi(MVC 5) PUT 方法不允许使用 HTTP/1.1 405 方法的主要内容,如果未能解决你的问题,请参考以下文章

状态码 405、PUT 和 DELETE 操作方法是不允许的

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

Angular 4 应用程序和 MVC WebAPI 之间的 PUT 请求出现 CORS 错误

mvc webapi怎么允许外部html访问

MVC 5 身份验证

使用 ASP.NET 5 MVC 6 Web API 进行 Cookie 身份验证