none
WEB Service. Enviar como parámetro un caracter de control ASCII. RRS feed

  • Pregunta

  • Hola.

    Estoy intentando enviar a un webservice  caracteres de control ASCII, pero me es imposible, y no consigo ver el modo.

    using (PService WeW = new PService())
    {
         string stringASCII = Encoding.ASCII.GetString(new byte[]{29});
         int f = WeW.Call(stringASCII );
                    
    }

    El caso que siempre me devuelve:

    "Error de la solicitud con el código de estado HTTP 400: Bad Request."

    ¿Alguien sabe si hay que hacer algo especial, o simplemente es imposible enviar caracteres no imprimibles ASCII a un web Service como parámetro?

    El caso que me hace falta si o si enviar varios caracteres especiales en uno de los campos alternados con otros valores.

    He leído que se podría serializar, pero no se muy bien si será efectivo o valido.

    Un saludo.


    • Editado sishco jueves, 5 de julio de 2018 17:01 Añadir información.
    jueves, 5 de julio de 2018 16:58

Respuestas

  • Por cerrar el tema, la solución que he tomado al final, es generar el XML SOAP directamente en vez de usar la clase que me da la referencia del web Service.

    var client = new RestClient(http://xxx.xxx.xxx.xxx:5102/ws/XXXXXX.RELAY.WSDL.RELAY_XXXXXX:WS_RELAY_XXXXXX); var request = new RestRequest(Method.POST);request.AddHeader("Postman-Token", "8d38fd30-27ea-400e-b5e3-543b50cf3dbf"); request.AddHeader("Cache-Control", "no-cache");

    request.AddHeader("Content-Type", "application/xml"); request.AddParameter("undefined", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <soap:Body>\n <WS_RELAY_XXXXXXX xmlns=\"http://tempuri.org/\">\n \t<inputs>\n \t\t<TRANS_DATE>20180706133251060</TRANS_DATE>\n \t\t<TRANS_TYPE>X</TRANS_TYPE>\n \t\t<IF_TYPE>1</IF_TYPE>\n \t\t<BODY_NO>G4F 010193 </BODY_NO>\n \t\t<LOT_NO>[)>\u001e06\u001dVR091\u001dP82651C1000S2C\u001dSLH-L2C\u001dT171213G2DPA0002649\u001dCLH-L2C\u001e\u001d\u0004</LOT_NO>\n \t\t<MAKE_DATE>20180704231151</MAKE_DATE>\n \t\t<XML_ID>E9ZK201807061332510601361</XML_ID>\n \t\t<TRANS_CODE>E9ZK</TRANS_CODE>\n \t\t<PROC_YN>1</PROC_YN>\n \t</inputs>\t\n </WS_RELAY_XXXXXXX>\n </soap:Body>\n</soap:Envelope>\n", ParameterType.RequestBody); IRestResponse response = client.Execute(request);

    Los caracteres de control ascii se los paso en formato \u001e06

    Con esto funciona correctamente siempre que se use "application/xml".

    • Marcado como respuesta sishco viernes, 13 de julio de 2018 6:19
    viernes, 13 de julio de 2018 6:19

Todas las respuestas

  • ¿Tiene que ser un String? El problema es que los Strings de .Net no son ASCII, son Unicode, y en Unicode no existe tal cosa como un "carácter de control ASCII". Tendrías que enviar los datos en binario, y la forma de indicar esos datos binarios en .Net es como byte[] en lugar de String. En el array de bytes sí que puedes insertar cualquier valor binario, incluyendo el equivalente de cualquier código ASCII.

    Desde luego, eso implica que en la definición del webservice tiene que definirse el parámetro como byte[] y no como string. Si no puedes modificar el webservice, probablemente tendrás que recurrir a construir o modificar a mano el paquete SOAP, teniendo en cuenta que los caracteres de control no son legales dentro del XML del paquete SOAP por lo que tendrías que meter su codificación equivalente con un escape hexadecimal.

    jueves, 5 de julio de 2018 18:51
    Moderador
  • El caso que el servicio web al que llamo recibe un String y no puedo cambiar el tipo de parámetro que recibe.

    He leído algo de que con SOAP 1.2 si que se pueden enviar estos caracteres.

    No se si será correcto, ni si con C# se podrían llegar a mandar, por que como bien comentas, al ser el tipo de dato string Unicode, no me permitiría mandar esos datos.

    La verdad que no se muy bien como o con que invocar al servicio web para mandarle esos datos.

    viernes, 6 de julio de 2018 12:58
  • Confíe más en lo que dice Alberto que en lo que voy a decir yo, porque la verdad siento que Alberto es mejor que yo en muchos aspectos.

    Sin embargo, como siempre, eso no me impide externar mi opinión, y mi opinión es la siguiente:  SOAP XML es XML, y XML es texto que puede escribirse en distintos encodings.  Antes que cualquier otra cosa, el mensaje SOAP es XML.  Si XML permite enviar los carácteres de control, SOAP por extensión debería también ser capaz de tal cosa.  Si XML permite varios encodings, un receptor de SOAP debería entonces permitir la recepción de SOAP en varios encodings.

    Pienso entonces que si Unicode es el problema, la solución tal vez podría residir en descubrir cómo producir el mensaje SOAP en encoding ANSI, que es un byte por carácter.


    Jose R. MCP
    My GIT Repositories | Mis Repositorios GIT

    viernes, 6 de julio de 2018 21:07
    Moderador
  • Por cerrar el tema, la solución que he tomado al final, es generar el XML SOAP directamente en vez de usar la clase que me da la referencia del web Service.

    var client = new RestClient(http://xxx.xxx.xxx.xxx:5102/ws/XXXXXX.RELAY.WSDL.RELAY_XXXXXX:WS_RELAY_XXXXXX); var request = new RestRequest(Method.POST);request.AddHeader("Postman-Token", "8d38fd30-27ea-400e-b5e3-543b50cf3dbf"); request.AddHeader("Cache-Control", "no-cache");

    request.AddHeader("Content-Type", "application/xml"); request.AddParameter("undefined", "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n <soap:Body>\n <WS_RELAY_XXXXXXX xmlns=\"http://tempuri.org/\">\n \t<inputs>\n \t\t<TRANS_DATE>20180706133251060</TRANS_DATE>\n \t\t<TRANS_TYPE>X</TRANS_TYPE>\n \t\t<IF_TYPE>1</IF_TYPE>\n \t\t<BODY_NO>G4F 010193 </BODY_NO>\n \t\t<LOT_NO>[)>\u001e06\u001dVR091\u001dP82651C1000S2C\u001dSLH-L2C\u001dT171213G2DPA0002649\u001dCLH-L2C\u001e\u001d\u0004</LOT_NO>\n \t\t<MAKE_DATE>20180704231151</MAKE_DATE>\n \t\t<XML_ID>E9ZK201807061332510601361</XML_ID>\n \t\t<TRANS_CODE>E9ZK</TRANS_CODE>\n \t\t<PROC_YN>1</PROC_YN>\n \t</inputs>\t\n </WS_RELAY_XXXXXXX>\n </soap:Body>\n</soap:Envelope>\n", ParameterType.RequestBody); IRestResponse response = client.Execute(request);

    Los caracteres de control ascii se los paso en formato \u001e06

    Con esto funciona correctamente siempre que se use "application/xml".

    • Marcado como respuesta sishco viernes, 13 de julio de 2018 6:19
    viernes, 13 de julio de 2018 6:19