.net - services3 - ¿Cómo puedo mezclar los tipos de codificación de mensajes(Texto/MTOM) en la solicitud de cliente de Solicitud y respuesta de un servicio web utilizando WCF(o WSE 3)?
web services3 nuget (5)
Aquí hay una respuesta que obtuve en otro foro. básicamente dice que el problema es con Axis2 en el lado de Java. Desafortunadamente, eso no está bajo mi control en este caso.
cherry111 - Publicado el sábado, 15 de noviembre de 2008 12:52:08 AM
Necesita cambiar la configuración en su servicio web AXIS2. Puede saber que puede habilitar MTOM en dos lugares. Uno está en service.xml y el otro está en axis.xml. Java recomienda que lo configure en service.xml, pero al cliente .net wse3.0 no le gusta. Si habilita MTOM en axis.xml, debería funcionar.
Aquí está mi problema. Estoy accediendo a un servicio web (alojado en un servidor basado en Java) que solo aceptará solicitudes codificadas por texto, pero devuelve respuestas MTOM. Lo que he encontrado es que si configuro el servicio web en RequireMtom, ¡envía una solicitud de Mtom! Lamentablemente, el servidor ahoga una solicitud Mtom y devuelve un error 500. Sin embargo, si configuro la codificación del mensaje de texto, la respuesta vuelve correctamente con una respuesta MIME (MTOM) multiparte que daña la API del servicio web de Microsoft (error de muestra a continuación). Espera una respuesta de texto codificado porque la solicitud fue codificada por texto. Me gustaría RequireMtom en la respuesta solamente. ¿Me puede ayudar alguien?
Como puede ver en el siguiente error (que ocurre con la API de servicios web estándar, WCF o WSE3), cuando envío la solicitud con codificación de texto, la respuesta vuelve correctamente con todos los datos en una respuesta multiparte / relacionada, pero el .net marco estrangula!
MENSAJE DE ERROR CON WSE:
Client found response content type of ''multipart/related; type="text/xml"; start="<1AE0B46A85B0186B5D136D12E1EE286E>"; boundary="----=_Part_209564_1891070135.1226526701833"'', but expected ''text/xml''.
The request failed with the error message:
at System.Web.Services.Protocols.SoapHttpClientProtocol.ReadResponse(SoapClientMessage message, WebResponse response, Stream responseStream, Boolean asyncCall)
at System.Web.Services.Protocols.SoapHttpClientProtocol.Invoke(String methodName, Object[] parameters)
at TestWseService.AdesaJasperWse.ManagementServiceService.runReport(String requestXmlString) in C:/Documents and Settings/xxx/My Documents/Visual Studio 2005/Projects/TestWseService/Web References/AdesaJasperWse/Reference.cs:line 229
at TestWseService.Form1.buttonRunService_Click(Object sender, EventArgs e) in C:/Documents and Settings/xxx/My Documents/Visual Studio 2005/Projects/TestWseService/Form1.cs:line 42
MENSAJE DE ERROR CON WCF
The content type multipart/related; type="text/xml"; start="<30ED8FE3004CDA67723CC7164A6CFEEC>"; boundary="----=_Part_209545_389093169.1226526546805" of the response message does not match the content type of the binding (text/xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 1024 bytes of the response were:
Server stack trace:
at System.ServiceModel.Channels.HttpChannelUtilities.ValidateRequestReplyResponse(HttpWebRequest request, HttpWebResponse response, HttpChannelFactory factory, WebException responseException)
at System.ServiceModel.Channels.HttpChannelFactory.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)
at System.ServiceModel.Channels.RequestChannel.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Dispatcher.RequestChannelBinder.Request(Message message, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Solicitud (con codificación de mensaje de texto):
POST /jasperserver-pro/services/repository HTTP/1.1
Content-Type: text/xml; charset=utf-8
VsDebuggerCausalityData: uIDPo7V2+runH+xGudbec7ueUU8AAAAA7H9vL3stlkCBofMgLa5DWkQOHHpBdy1Ek6P6nXx7FpsACQAA
SOAPAction: ""
Authorization: Basic amFzcGVyYWRtaW46akBzcDNyQGRtJW4=
Host: reports.dev.xxx.com
Content-Length: 789
Expect: 100-continue
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><q1:runReport xmlns:q1="http://axis2.ws.jasperserver.jaspersoft.com"><requestXmlString xsi:type="xsd:string"><request operationName="runReport" locale="en">
<argument name="RUN_OUTPUT_FORMAT">HTML</argument>
<resourceDescriptor name="" wsType="" uriString="/BusinessIntelligence/MOS/Reports/dotnettest" isNew="false">
<label>null</label>
<parameter name="testparam">1</parameter>
</resourceDescriptor>
</request></requestXmlString></q1:runReport></s:Body></s:Envelope>
Respuesta (con codificación de mensajes de texto):
HTTP/1.1 200 OK
Date: Wed, 12 Nov 2008 21:49:04 GMT
Server: IBM_HTTP_Server
Surrogate-Control: no-store
Set-Cookie: JSESSIONID=0000z5pH1xEMyulueASctjru2qe:13kftunf6; Path=/
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
Content-Length: 2580
Content-Type: multipart/related; type="text/xml"; start="<30ED8FE3004CDA67723CC7164A6CFEEC>"; boundary="----=_Part_209545_389093169.1226526546805"
Content-Language: en-US
------=_Part_209545_389093169.1226526546805
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <30ED8FE3004CDA67723CC7164A6CFEEC>
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body><ns1:runReportResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://axis2.ws.jasperserver.jaspersoft.com"><runReportReturn xsi:type="xsd:string"><?xml version="1.0" encoding="UTF-8"?>
<operationResult version="2.0.1">
<returnCode><![CDATA[0]]></returnCode>
</operationResult>
</runReportReturn></ns1:runReportResponse></soapenv:Body></soapenv:Envelope>
------=_Part_209545_389093169.1226526546805
Content-Type: text/html
Content-Transfer-Encoding: binary
Content-Id: <report>
<html>
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<style type="text/css">
a {text-decoration: none}
</style>
</head>
<body text="#000000" link="#000000" alink="#000000" vlink="#000000">
<table width="100%" cellpadding="0" cellspacing="0" border="0">
<tr><td width="50%"> </td><td align="center">
<a name="JR_PAGE_ANCHOR_0_1"/>
<table style="width: 595px" cellpadding="0" cellspacing="0" border="0" bgcolor="white">
<tr>
<td><img alt="" src="images/px" style="width: 35px; height: 1px;"/></td>
<td><img alt="" src="images/px" style="width: 189px; height: 1px;"/></td>
<td><img alt="" src="images/px" style="width: 253px; height: 1px;"/></td>
<td><img alt="" src="images/px" style="width: 118px; height: 1px;"/></td>
</tr>
<tr valign="top">
<td colspan="4"><img alt="" src="images/px" style="width: 595px; height: 20px;"/></td>
</tr>
<tr valign="top">
<td><img alt="" src="images/px" style="width: 35px; height: 30px;"/></td>
<td valign="middle"><span style="font-family: Arial; font-size: 12.0px; font-weight: bold;">The value of the parameter is:</span></td>
<td valign="middle"><span style="font-family: Arial; background-color: #FFFFFF; font-size: 12.0px; font-weight: bold;">1</span></td>
<td><img alt="" src="images/px" style="width: 118px; height: 30px;"/></td>
</tr>
<tr valign="top">
<td colspan="4"><img alt="" src="images/px" style="width: 595px; height: 20px;"/></td>
</tr>
</table>
</td><td width="50%"> </td></tr>
</table>
</body>
</html>
------=_Part_209545_389093169.1226526546805--
Solicitud (con codificación de mensajes Mtom):
POST /jasperserver-pro/services/repository HTTP/1.1
MIME-Version: 1.0
Content-Type: multipart/related; type="application/xop+xml";start="<http://tempuri.org/0>";boundary="uuid:fafcdca7-94f7-4884-a8d4-5c6d50dbe8ef+id=1";start-info="text/xml"
VsDebuggerCausalityData: uIDPo+cN2kKX2odFuUVaER0j60gAAAAAmfYaGH7Ow0WQOcwhebh5pqmDl29omcVOtwVGa10IWewACQAA
SOAPAction: ""
Authorization: Basic amFzcGVyYWRtaW46akBzcDNyQGRtJW4=
Host: reports.dev.xxx.com
Content-Length: 1031
Expect: 100-continue
--uuid:fafcdca7-94f7-4884-a8d4-5c6d50dbe8ef+id=1
Content-ID: <http://tempuri.org/0>
Content-Transfer-Encoding: 8bit
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><q1:runReport xmlns:q1="http://axis2.ws.jasperserver.jaspersoft.com"><requestXmlString xsi:type="xsd:string"><request operationName="runReport" locale="en">
<argument name="RUN_OUTPUT_FORMAT">HTML</argument>
<resourceDescriptor name="" wsType="" uriString="/BusinessIntelligence/MOS/Reports/dotnettest" isNew="false">
<label>null</label>
<parameter name="testparam">1</parameter>
</resourceDescriptor>
</request></requestXmlString></q1:runReport></s:Body></s:Envelope>
--uuid:fafcdca7-94f7-4884-a8d4-5c6d50dbe8ef+id=1--
Respuesta (con codificación de mensajes Mtom):
HTTP/1.1 500 Internal Server Error
Date: Wed, 12 Nov 2008 21:47:42 GMT
Server: IBM_HTTP_Server
Surrogate-Control: no-store
$WSEP:
Set-Cookie: JSESSIONID=0000_iMrdp-TnK9FG3jZFzjx_hA:13kftunf6; Path=/
Expires: Thu, 01 Dec 1994 16:00:00 GMT
Cache-Control: no-cache="set-cookie, set-cookie2"
Content-Length: 12
Connection: close
Content-Type: text/html;charset=UTF-8
Content-Language: en-US
Error 500:
Aquí hay un enlace que respalda la teoría de que Microsoft no admite codificaciones mixtas:
WSE 3.0: ¿Respuesta MTOM obligatoria para la solicitud MTOM?
UHG!
Investigué un poco sobre esto y la mala noticia es que desde el punto de vista de WCF, la solicitud y la respuesta DEBEN usar el mismo descubrimiento. Entonces sí, la respuesta anterior es bastante correcta. Debe organizarse con el proveedor del servicio para habilitar MTOM tanto en la solicitud como en la respuesta. La solicitud MTOM no tendrá ningún impacto en su aplicación, aparte de cambiar el tipo SOAP mime, hasta donde yo sé.
Sí WCF tiene ese requisito obligatorio y NO, porque puede solucionarlo como yo lo hice.
Escribí un MultiContentTypeMessageEncoder que encapsula 3 codificadores diferentes text, mtom y fi. También planeo encapsular un codificador gpb si es posible y si hay una buena razón para hacerlo, en el futuro
Sí, puede enviar un mensaje de texto y obtener una respuesta mínima (o viceversa) con WCF.
ver...
http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/480f1bc4-1fc4-40e9-a2ed-efcf3009d6ef
[WSE 3.0] Puede definir una nueva clase que herede de su objeto proxy WSE3 con un solo método de anulación GetWebResponse.
En el método GetWebResponse, puede simplemente elegir si desea usar la codificación mtom de acuerdo con el tipo de contenido de la respuesta.
Después de eso, debes usar esta clase proxy en lugar de la generada.
PD: La clase de proxy WSE3 debe generarse usando wsewsdl3 como un Cliente Web (agregue esta opción / tipo: webCliente a la línea de recomendación).
Referencia: http://www.codeproject.com/Tips/46257/Solution-to-WSE-error-for-WSE-clients-needing .