3

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

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;

        }

    }

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

谢谢

4

4 回答 4

4

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

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

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

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

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

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

于 2014-06-28T11:35:56.660 回答
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,但这对于似乎以某种方式依赖于 WebDAV 处理 CSS 和 JS 内容的实际 Web 应用程序(而不是 API)来说似乎是个坏消息。所以在这里我刚刚从 WebAPI 中删除了它。我没有运气允许特定的动词 PUT,也没有“*”。无论如何,从我所看到的一切来看,WebDAV 都会在 PUT 上出现问题。]

于 2016-09-20T19:16:06.677 回答
0

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

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

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

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

于 2014-06-28T07:58:55.820 回答
0

在没有看到您的请求的情况下,我很确定您发送的 ID 像http://www.fluff.com/api/Fluff?id=MyID,像http://www.fluff.com/api/一样发送绒毛/MyID代替。

在此处查看我之前的答案: https ://stackoverflow.com/a/25577497/1176452

于 2015-11-13T12:34:50.340 回答