2010-08-11 194 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"; 
}