我的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;
}
}
我已经检查并测试了所有可能的解决方案以解决此错误。但是面临同样的问题。
由于
答案 0 :(得分:3)
正如我在您的帖子中所看到的,您正在使用IIS/8.0
。 405: Method not allowed
以及PUT
动词的错误DELETE
是此环境中众所周知的问题。
所有证据似乎都围绕着名为WebDAV
的IIS模块的干扰。您需要全局卸载它或在本地为您的项目禁用它。此外,您可能需要修改applicationhost.config
文件才能使用PUT
动词。
如果您知道自己不需要WebDAV
,那么完全禁用它或从IIS卸载它可能会更好。但是,如果您不知道您或其他人共享您的服务器是否需要它,那么最好禁用您在本地不需要的功能,以避免导致问题其他
我可以在这里复制另一个SO Q&amp; A,或者你可以看一下this question和non-accepted answer to this question的接受答案。
人们通常对基于链接中包含的信息的答案不满意,但由于他们都在SO中,我希望只要您的问题处于活动状态,他们就会保持活跃状态。如果您发现任何有用的信息,请考虑提交它们。
最后,这个(SO的外部)link还解释了如何从IIS角色和功能配置中全局卸载WebDAV
功能。
答案 1 :(得分:0)
如果您查看来自Web服务器的响应,它会列出允许的动词。 PUT不是其中之一。
编辑web.config以为您的应用程序启用PUT。
这在本地工作的原因,我相信是因为IIS Express和卡西尼没有强制执行动词限制。
在此处向下滚动到配置示例:http://www.iis.net/configreference/system.webserver/security/requestfiltering/verbs
答案 2 :(得分:0)
如果没有看到您的请求,我确定您发送了http://www.fluff.com/api/Fluff?id=MyID这样的ID,请将其发送到http://www.fluff.com/api/Fluff/MyID。
请在此处查看我之前的回答: https://stackoverflow.com/a/25577497/1176452
答案 3 :(得分:0)
在你的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上的barfs。]