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 页面的请求相同的位置。为什么这些会有所不同?

4

3 回答 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>
于 2014-09-11T02:27:23.967 回答
0

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

此外,您可能想要删除 Content-Type 标头,除非您真的打算发送带有请求的正文(这对于 DELETE 来说是非正统的......)

于 2010-08-11T17:52:55.590 回答
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";
}
于 2015-10-22T14:21:19.263 回答