2010-08-11 195 views
8

我試圖做從我的代碼在C#中的HTTP DELETE後面,是無法做到這一點。在查看WebRequestMethods.Http類型的成員之後,我甚至不確定這是可能的。HTTP DELETE請求

這裏是我的代碼:

try 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost/NameFiles/00000.txt"); 
    request.Method = "DELETE"; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

    if (response.StatusCode == HttpStatusCode.OK) 
    { 
     // some code 
    } 
} 
catch (Exception ex) 
{ 
    ex.ToString(); 
} 

從我的開發環境中運行此我得到:「遠程服務器返回錯誤:(401)未經授權。」

我收到了,我認爲有事情做在IIS設置的服務器上的一個不同的結果:「遠程服務器返回錯誤:(501)未實現」另外,正如我在下面對答案的評論中所提到的,我能夠使用c#在同一服務器上使用vbscript將經典asp頁面的DELETE請求發送到與來自我的aspx頁面的請求相同的位置。爲什麼這些會不一樣?

+1

HTTP DELETE非常**非常深奧。很少有Web服務器支持它。 (有充分理由!) – 2010-08-11 17:12:49

+0

@Kirk Woll - 我可以在使用vbscript的經典asp頁面的相同服務器上執行此操作。 – 2010-08-11 17:38:28

+6

究竟是如何「深奧」? – 2010-08-11 17:50:38

回答

0

401意味着服務器希望你驗證(也許它允許匿名訪問只進行讀操作)?

此外,你可能需要刪除的Content-Type頭,除非你真的打算送體與請求(這將是非正統的刪除...)

+0

我會嘗試弄清楚我是否需​​要進行身份驗證。任何想法,爲什麼我可以用傳統的ASP/VBScript而不是我的ASPX/Csharp發送DELETE請求有什麼不同?我沒有進行身份驗證。 – 2010-08-11 19:08:17

+0

在這種情況下,答案通常是:因爲§%&「%§服務器查看User-Agent標題字段,只是瘋狂猜測,獲取跟蹤信息。 – 2010-08-13 06:40:20

2
  1. 您應該刪除內容類型這裏沒用的標題。
  2. 檢查,如果你使用的是IIS,如果文件/文件夾,您試圖刪除有權刪除。這些是我能想到的用戶: IUSR或IUSR_MachineName帳戶。 IIS_IUSRS或IIS_WPG組。
  3. 對於501錯誤返回 - PUT,DELETE,默認情況下未啓用OPTIONS。因此,您需要在Web服務器級別啓用。

你應該確保下面的配置是否有在配置文件中。您還可以看到一些與刪除相關的其他帖子。 (修改以下適合您環境的設置)。

<handlers> 
     <remove name="WebDAV" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" /> 
     <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" /> 
     <remove name="ExtensionlessUrlHandler-Integrated-4.0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" /> 
     <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" /> 
    </handlers> 
0

下面的代碼適用於我,它可能對您有些用處。

string headername = "TokenName"; 
string headervalue = "0000000000"; 

var request = (HttpWebRequest)WebRequest.Create("https://URL"); 

request.Method = "DELETE"; 
request.Headers.Add(headername, headervalue); 

try 
{ 
    var response = (HttpWebResponse)request.GetResponse(); 

    var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

    var jss = new JavaScriptSerializer(); 
    var dict = jss.Deserialize<dynamic>(responseString); 
    string message += "deleted Item with id" + dict["id"]; 
} 
catch 
{ 
    string message += "Didn't delete Item"; 
}