HTTP DELETE请求

时间:2010-08-11 17:10:23

标签: c# http http-delete

我正在尝试从我的代码后面的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页面发送请求到同一位置。为什么这些会有所不同?

3 个答案:

答案 0 :(得分:2)

  1. 你应该删除在这里没用的Content-Type标题。
  2. 检查您是否使用IIS,以及您尝试删除的文件/文件夹是否有权删除。这些是我能想到的用户: IUSR或IUSR_MachineName帐户。 IIS_IUSRS或IIS_WPG组。
  3. 对于501错误返回 - PUT,DELETE,默认情况下不启用OPTIONS。因此,您需要在Web服务器级别启用。
  4. 您应确保配置文件中包含以下配置。您还可以看到与删除相关的其他一些帖子。 (修改以下适合您环境的设置)。

     <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>
    

答案 1 :(得分:0)

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

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

答案 2 :(得分: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";
}