none
El valor especificado tiene caracteres de encabezado HTTP no válidos. Nombre del parámetro: name RRS feed

  • Pregunta

  • Lenguaje de programación C#.

    Al ejecutar un servicio de la siguiente forma:

    string sSoapResponse;
    
    string url = "http://MiUrl/clientes/comerciales.dll?Handler=Default";
    
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url);
    
    httpWebRequest.ContentType = "text/xml;charset=\"utf-8\"";
    httpWebRequest.Accept = "text/xml";
    httpWebRequest.Method = "POST";
    
    var soapEnvelopeXml = new XmlDocument();
    
    soapEnvelopeXml.LoadXml(requestXML);
    
    using (var stream = httpWebRequest.GetRequestStream())
    {
        soapEnvelopeXml.Save(stream);
    }
    
    using (var respuesta = httpWebRequest.GetResponse())
    {
        using (var rd = new StreamReader(respuesta.GetResponseStream()))
        {
            sSoapResponse = rd.ReadToEnd();
        }
    }

    La respuesta fue:

    ERROR: The remote server returned an error: (500) Internal Server Error. STATUS: ProtocolError Status Code : InternalServerError Status Description : Internal Server Error

    <html>
    <head>
    <title>Server Error</title>
    </head>
    <body>
    <H1>Server Error</H1>
    <P>SOAP request did not provide SOAPACTION header.</body>
    </html> 

    Entiendo que debo agregar algo como esto:
    httpWebRequest.Headers.Add("SOAP:Action"); Que al incluirlo arroja esto: El valor especificado tiene caracteres de encabezado HTTP no válidos. Nombre del parámetro: name

    ¿Cómo hago para incluir el SOAPACTION?

    La url del servicio es provista por un tercero, yo debo consumirlo, este servicio no expone el wsdl por razones de seguridad.

    Gracias de antemano.

    Saludos

    martes, 4 de diciembre de 2018 20:08

Respuestas

  • EL SoapAction tiene que quedar así en la cabecera del paquete HTTP:

    SOAPAction: MiSoapAction

    Lo generarías así:

    httpWebRequest.Headers.Add("SOAPAction", "MiSoapAction");

    El texto que hay que poner en "MiSoapAction" te lo tiene que decir el proveedor del servicio. Normalmente se saca del WSDL, viene como atributo del soap:operation. Es una tontería que no te den el WSDL "por razones de seguridad". Una cosa es que el WSDL no se "publique" haciéndolo visible al público en general, y otra cosa es que no se entregue privadamente a los usuarios legítimos del servicio. Aquí no hay "razón de seguridad" que valga; el WSDL no contiene ningún dato que sea distinto de la información que hay que facilitar a los llamantes para que hagan la llamada. Si hay otras funciones en el sitio web que no se quieren dar a conocer, se pueden "recortar" del wsdl y entregar un wsdl parcial que solo contenga las operaciones que estás autorizado a realizar.

    martes, 4 de diciembre de 2018 20:30