2014-06-28 230 views
3

我的Android應用程序需要更新一些數據到服務器,我寫了一些WebApi代碼用於更新並從我的Android應用程序發送數據。 兩個工作,當我在本地服務器正在測試正常,但上傳到全球它不工作,並給出錯誤,如後:HTTP/1.1 405方法不允許WebApi(MVC 5)PUT方法

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

我用簡單的代碼都在(無論是在Android應用程序和菲德勒測試) 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; 

     } 

    } 

我已經檢查並測試所有可能的解決方案來解決此錯誤。但面臨同樣的問題。

謝謝

回答

3

,我可以從你的帖子看,你使用IIS/8.0。錯誤405: Method not allowedPUT,也是DELETE,動詞是這個環境中的一個衆所周知的問題。

所有證據似乎都圍繞着一個名爲WebDAV的IIS模塊的干擾。您需要全局卸載或在本地爲您的項目禁用它。另外,您可能需要編輯applicationhost.config文件以允許PUT動詞。

如果你知道你不需要WebDAV,最好是完全禁用它或從IIS上卸載它。但是,如果您不知道您或他人共享您的服務器是否需要它,那麼最好禁用本地不需要的功能以避免爲其他人帶來問題。

我可以複製另一個SO Q & A在這裏,或者你可以看看接受的答案this question以及non-accepted answer to this question

對於基於鏈接中所含信息的答案,人們通常會皺眉,但由於它們都在SO中,我希望只要您的問題處於活動狀態,它們就會保持活躍狀態​​。如果您發現任何有用的信息,請考慮將它們提升。

最後,這個(外部於SO)link也解釋瞭如何從IIS角色和功能配置全局卸載WebDAV功能。

+0

感謝您的答案.. + 1的鏈接..我檢查所有解決方案.. – Ranjit

+0

抱歉。 .no解決方案爲我工作..所以最後我改變了我的方法從投入職位..感謝 – Ranjit

+0

對不起,聽到上述沒有幫助。找到原因會很有趣,但根據這個[鏈接](http://stackoverflow.com/questions/6058027/cassini-and-iisexpress-put-delete-verbs-cause-405-http-code) ,你可以做任何事情。至少你已經起來跑步了,這是主要的。在這一天結束時,您需要務實,並像您一樣採用解決方法。 – djikay

0

如果您查看Web服務器的響應,它會列出允許的動詞。 PUT不是其中之一。

編輯您的web.config以爲您的應用程序啓用PUT。

這是在本地工作的原因,我相信是因爲IIS Express和Cassini不強制執行動詞限制。

向下滾動配置示例這裏:http://www.iis.net/configreference/system.webserver/security/requestfiltering/verbs

+0

謝謝你的回覆,但你能解釋一點點清楚或給一些例子,如何啓用放置在網頁配置。 – Ranjit

+0

已編輯的帖子包含指向示例的鏈接。 – Morten

+0

抱歉它沒有工作..通過添加這些句子,我的其他方法停止工作.. – Ranjit

0

在你的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> 

或者你可以從IIS(它會讓web.config中的變化)做,如果你從處理程序映射和模塊刪除的WebDav。 [背景:我最初試圖從我的服務器中徹底擺脫WebDAV,但這似乎是對實際的Web應用程序(而不是API)的壞消息,它似乎取決於CSS的WebDAV處理方式JS內容。所以在這裏我剛剛從WebAPI中刪除它。我沒有運氣允許特定的動詞PUT,也沒有「*」。 WebDAV只是在PUT上的barfs無論如何,從我能看到的所有東西。]