2010-08-11 4 views
8

Я пытаюсь выполнить HTTP DELETE на C# из моего кода и не могу этого сделать. Посмотрев на элементы типа WebRequestMethods.Http, я даже не уверен, что это возможно.HTTP DELETE request

Вот мой код:

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) Не реализовано».

Кроме того, как я упоминал в комментарии к нижеприведенному ответу, я могу отправить запросы DELETE с классической страницы asp, используя vbscript на том же сервере, в том же месте, что и запрос с моей страницы aspx, используя C#. Почему это было бы иначе?

+1

HTTP DELETE ** чрезвычайно ** эзотерический. Поддержка нескольких веб-серверов. (по уважительной причине!) –

+0

@Kirk Woll - я могу сделать это на том же сервере с классической страницей asp с помощью vbscript. –

+6

Точно как это «эзотерическое»? –

ответ

0

401 означает, что сервер ожидает аутентификации (возможно, он позволяет анонимный доступ только для операций чтения)?

Кроме того, вы можете удалить заголовок Content-Type, если вы действительно планируете отправить тело запроса (который будет неортодоксальные для УДАЛИТЬ ...)

+0

Я постараюсь выяснить, нужна ли мне аутентификация. Любая идея, какая разница в том, почему я могу отправлять запросы DELETE с использованием классического asp/vbscript, а не моего aspx/csharp? Я тоже не аутентифицируюсь. –

+0

В таких случаях часто возникает ответ: потому что сервер%% и%% смотрит в поле заголовка User-Agent. Просто дикое предположение. Получите трассировку. –

2
  1. Вы должны удалить Content-Type который бесполезен здесь.
  2. Проверьте, используете ли вы IIS, и если файлы/папки, которые вы пытаетесь удалить, имеют права на удаление. Это пользователь, о котором я могу думать: Учетная запись IUSR или IUSR_MachineName. Группа IIS_IUSRS или IIS_WPG.
  3. Для возврата ошибки 501 - PUT, DELETE, OPTIONS по умолчанию не включены. Следовательно, вам необходимо включить на уровне веб-сервера.

Вы должны убедиться, что в конфигурационном файле находятся следующие конфигурации. Вы также можете увидеть некоторые другие сообщения, связанные с удалением. (измените ниже настройки, соответствующие вашей среде).

<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"; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^