繁体   English   中英

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

[英]HTTP/1.1 405 Method Not Allowed for WebApi(MVC 5) PUT Method

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

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

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

Android代码:

            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;

        }

    }

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

谢谢

正如我从你的帖子中看到的,你正在使用IIS/8.0 错误405: Method not allowed PUT ,以及DELETE ,动词是这个环境的一个众所周知的问题。

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

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

我可以在这里复制另一个SO Q&A,或者你可以看一下这个问题的接受答案以及这个问题未被接受的答案

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

最后,此(SO外部) 链接还说明了如何从IIS角色和功能配置中全局卸载WebDAV功能。

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

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

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

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

在没有看到您的请求的情况下,我非常确定您发送的身份证如http://www.fluff.com/api/Fluff?id=MyID ,请将其发送到http://www.fluff.com/api/相反, 绒毛/ MyID

请参阅我之前的回答: https//stackoverflow.com/a/25577497/1176452

在你的web.config中删除WebDAV,所以除了你已经拥有的任何其他内容之外,请确保将其删除。

<?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上的barf,从我能看到的一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM