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

C# WebApi(MVC 5)PUT方法不允许使用HTTP/1.1 405方法,c#,android,asp.net-web-api,put,server-error,C#,Android,Asp.net Web Api,Put,Server Error,我的android应用程序需要将一些数据更新到服务器,我已经为服务器编写了一些WebApi代码,用于更新和从android应用程序发送数据。 当我在本地服务器上进行测试时,两者都可以正常工作,但在上传到global之后,它就不起作用了,并且出现了如下错误:在android应用程序和fidler中都进行了测试 HTTP/1.1 405 Method Not Allowed Allow: GET, HEAD, OPTIONS, TRACE Content-Type: text/html Server

我的android应用程序需要将一些数据更新到服务器,我已经为服务器编写了一些WebApi代码,用于更新和从android应用程序发送数据。 当我在本地服务器上进行测试时,两者都可以正常工作,但在上传到global之后,它就不起作用了,并且出现了如下错误:在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中都使用了简单的代码:

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;

        }

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


谢谢

如果您查看web服务器的响应,它会列出允许的动词。普特不是其中之一

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

我认为这在本地起作用的原因是因为IIS Express和Cassini没有强制执行动词限制


向下滚动到此处的配置示例:

正如我从您的帖子中看到的,您正在使用IIS/8.0。错误405:方法不允许用于PUT和DELETE动词,这是此环境中的一个众所周知的问题

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

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

我可以在这里复制另一个Q&A,或者你可以只看一看被接受的答案和答案

人们通常不喜欢基于链接中包含的信息的答案,但是,既然他们都是这样,我希望他们会保持活跃,只要你的问题是活跃的。如果您发现任何有用的信息,请考虑对其进行投票。
最后,此SO外部文件还解释了如何从IIS角色和功能配置中全局卸载WebDAV功能。

在没有看到您的请求的情况下,我很确定您发送的ID是like,而不是like

请参见我之前的回答:

在您的web.config中删除WebDAV,因此请确保除了您已有的任何其他内容之外,还删除了这两个

或者,您可以从IIS执行此操作。如果从处理程序映射和模块中删除WebDav,则会更改web.config


[背景:我最初试图从我的服务器上完全删除WebDAV,但这对于实际的web应用程序来说似乎是个坏消息,而API似乎在某种程度上依赖于WebDAV对CSS和JS内容的处理。因此,我刚刚从WebAPI中删除了它。我没有运气允许特定的动词PUT,也没有*。WebDAV只是呕吐不管怎样,从我所能看到的一切来看

谢谢你的回复,但是你能解释清楚一点,或者举一些例子,说明如何在web config.Edited post中启用put以包含指向示例的链接。对不起,它不起作用。通过添加这些句子,我的其他方法就不起作用了。只需添加所有你需要的动词。对不起。没有解决方案对我有效。因此,最后我将我的方法从put改为put发帖..谢谢你听到上面的话没有帮助。找出原因是很有意思的,但是,根据这一点,你可能无能为力。至少你已经开始运转了,这是最重要的。在一天结束时,你需要务实一点,继续解决问题,就像你做的那样。如果你已经完成了上面的工作,但仍然在为它而挣扎他和你正在使用AttributeRouting,然后这为我修复了它:tl;dr:AttributeRouting中有一个错误,HttpPut请求被阻止,除非你显式地用[HttpPut]修饰方法。这可能已在较新版本中修复,但如果您使用的是较旧的版本,则仍可能会造成问题。我从Windows 7安装中卸载了WebDAV,它破坏了所有CSS/JS交付,它以文本/html的形式出现,浏览器拒绝了它。立即重新安装了WebDAV。因此…我不明白为什么会出现WebDAV,但为什么会出现WebDAV对于某些动词的问题,卸载它也不一定是一个好的选择。