2010-08-11 16 views
8

Estoy intentando hacer un HTTP DELETE en C# desde mi código y no puedo hacer esto. Después de mirar a los miembros del tipo WebRequestMethods.Http, ni siquiera estoy seguro de que esto sea posible.solicitud HTTP DELETE

Aquí está mi código:

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(); 
} 

La ejecución de este entorno de desarrollo de mi me sale: "El servidor remoto devolvió un error: (401) no autorizado."

He recibido un resultado diferente en un servidor que supongo que tiene algo que ver con la configuración en IIS: "El servidor remoto devolvió un error: (501) No implementado."

Además, como mencioné en un comentario de una respuesta a continuación, puedo enviar solicitudes DELETE de una página asp clásica utilizando vbscript en el mismo servidor a la misma ubicación que la solicitud de mi página aspx utilizando C#. ¿Por qué serían estos diferentes?

+1

HTTP DELETE es ** extremadamente ** esotérico. Muy pocos servidores web lo admiten. (¡por una buena razón!) –

+0

@Kirk Woll: puedo hacer esto en el mismo servidor con una página asp clásica usando vbscript. –

+6

¿Exactamente cómo es "esotérico"? –

Respuesta

0

401 significa que el servidor espera que se autentique (¿tal vez permite el acceso anónimo solo para las operaciones de lectura)?

Además, es posible que desee eliminar la cabecera Content-Type a menos que realmente va a enviar un cuerpo con la solicitud (que sería poco ortodoxo para Eliminar ...)

+0

Trataré de averiguar si necesito autenticarme. ¿Alguna idea de la diferencia en cuanto a por qué puedo enviar solicitudes DELETE con el clásico asp/vbscript y no con mi aspx/csharp? No estoy autenticando con ninguno de los dos. –

+0

En casos como este, la respuesta es con frecuencia: porque el servidor §% & "% § mira el campo de encabezado User-Agent. Simplemente una conjetura salvaje. Obtenga un seguimiento. –

2
  1. debe quitar Content-Type encabezado que es inútil aquí.
  2. Compruebe si está utilizando IIS y si los archivos/carpetas que está intentando eliminar tienen derechos para eliminar. Estos son los usuarios que puedo pensar: La cuenta IUSR o IUSR_MachineName. El grupo IIS_IUSRS o IIS_WPG.
  3. Para el retorno de error 501 - PUT, DELETE, OPTIONS no están habilitados por defecto. Por lo tanto, debe habilitar a nivel del servidor web.

Debe asegurarse de que las siguientes configuraciones estén en el archivo de configuración. También puedes ver alguna otra publicación relacionada con eliminar. (modifique la configuración a continuación que se adapta a su entorno).

<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

El siguiente código funcionó para mí, podría ser de alguna utilidad para usted también.

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