HTTP DELETE请求

8
我正在尝试在C#中从我的代码后台执行HTTP DELETE操作,但无法完成此操作。查看WebRequestMethods.Http类型的成员后,我甚至不确定是否可能实现这一点。
以下是我的代码:
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)未实现"。
此外,正如我在下面的评论中提到的,我能够通过使用vbscript在相同的服务器上从一个经典asp页面发送DELETE请求到与使用c#从我的aspx页面发送请求的相同位置。为什么会出现这些不同?

1
HTTP DELETE非常晦涩难懂。很少有Web服务器支持它。(有充分的理由!) - Kirk Woll
@Kirk Woll - 我能够使用vbscript在同一台服务器上的经典asp页面上完成这个任务。 - Jeremy Cron
6
“esoteric”是什么意思? - Julian Reschke
你确定不需要授权令牌吗? 如果需要,您需要提供类似以下的标头: request.Headers.Add("headername", "headervalue"); 其中 headername 是令牌名称,headervalue 是实际的令牌值。 - Djeroen
3个回答

2
  1. 在此处无用,应该删除Content-Type头部。
  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";
}

0

401 表示服务器期望您进行身份验证(也许只允许匿名访问读操作)?

此外,除非您真的计划发送请求正文(这对于 DELETE 来说是不规范的),否则您可能希望删除 Content-Type 标头。


我会尝试弄清楚是否需要进行身份验证。有什么想法,为什么我能够使用经典的asp/vbscript发送DELETE请求,而不能使用我的aspx/csharp?我没有使用任何身份验证。 - Jeremy Cron
在这种情况下,答案通常是:因为§%&"%§服务器查看User-Agent头字段。这只是一个猜测。获取一个跟踪。 - Julian Reschke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接