2017-09-01 51 views
1

我referncing從我的.NET項目在PHP創建SOAP服務,我有編碼的一些問題,並能夠使用這個庫CustomTextMessageEncoderhttps://code.msdn.microsoft.com/vstudio/Invoking-a-web-service-9714e53e/sourcecode?fileId=75606&pathId=391881754 https://docs.microsoft.com/en-us/dotnet/framework/wcf/samples/custom-message-encoder-custom-text-encoderSOAP CustomTextMessageEncoder

我的網絡來解決這些問題。配置看起來像這樣

<binding name="WSCalculadoraBinding" > 
     <customTextMessageEncoding encoding="ISO-8859-1" 
     messageVersion="Soap11"/> 
     <httpTransport /> 
</binding> 

它的工作原理主要是很好的,但對於一些特定的數據,它將引發此異常

{ 
    "Message": "Error.", 
    "ExceptionMessage": "Error al deserializar el cuerpo del mensaje de respuesta para la operación 'wsCotizar'.", 
    "ExceptionType": "System.ServiceModel.CommunicationException", 
    "StackTrace": "\r\nServer stack trace: \r\n en System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)\r\n en System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)\r\n en System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)\r\n en System.ServiceModel.Dispatcher.OperationFormatter.DeserializeReply(Message message, Object[] parameters)\r\n en System.ServiceModel.Dispatcher.ProxyOperationRuntime.AfterReply(ProxyRpc& rpc)\r\n en System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime operation, ProxyRpc& rpc)\r\n en System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)\r\n en System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)\r\n en System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)\r\n\r\nException rethrown at [0]: \r\n en System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)\r\n en System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)\r\n en Cognos.Services.Baneco.Calculadora.WSCalculadoraPortType.wsCotizar(String login, String password, String tipodependencia, Int32 ingresos, String categoria, String otroscreditos, String cuotas, String alquiler, String tipobien, Int32 montobien, String moneda, Int32 monto, String tasa, Int32 plazo)\r\n en Cognos.Services.Baneco.Calculadora.WSCalculadoraPortTypeClient.wsCotizar(String login, String password, String tipodependencia, Int32 ingresos, String categoria, String otroscreditos, String cuotas, String alquiler, String tipobien, Int32 montobien, String moneda, Int32 monto, String tasa, Int32 plazo) en E:\\_Git\\Cognos.Services\\Service References\\Baneco.Calculadora\\Reference.cs:línea 231\r\n en Cognos.Services.Calculadora.Calculadora.Cotizar(String tipodependencia, Int32 ingresos, String categoria, String otroscreditos, String cuotas, String alquiler, String tipobien, Int32 montobien, String moneda, Int32 monto, String tasa, Int32 plazo) en E:\\_Git\\Cognos.Services\\Calculadora\\Calculadora.cs:línea 26\r\n en Cognos.Library.Baneco.Calculadora.Cotizar(String tipodependencia, Int32 ingresos, String categoria, String otroscreditos, String cuotas, String alquiler, String tipobien, Int32 montobien, String moneda, Int32 monto, String tasa, Int32 plazo) en E:\\_Git\\Cognos.Library\\Baneco\\Calculadora.cs:línea 20\r\n en Cognos.Negocio.Api.Controllers.Calculadora.CalculadoraController.Cotizar(String tipodependencia, Int32 ingresos, String categoria, String otroscreditos, String cuotas, String alquiler, String tipobien, Int32 montobien, String moneda, Int32 monto, String tasa, Int32 plazo) en E:\\_Git\\Cognos.Negocio.Api\\Controllers\\Calculadora\\CalculadoraController.cs:línea 19\r\n en lambda_method(Closure , Object , Object[])\r\n en System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)\r\n en System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)\r\n en System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Web.Http.Filters.ActionFilterAttribute.<CallOnActionExecutedAsync>d__5.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Filters.ActionFilterAttribute.<ExecuteActionFilterAsyncCore>d__0.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Web.Http.Controllers.ExceptionFilterResult.<ExecuteAsync>d__0.MoveNext()\r\n--- Fin del seguimiento de la pila de la ubicación anterior donde se produjo la excepción ---\r\n en System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n en System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n en System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()", 
    "InnerException": { 
     "Message": "Error.", 
     "ExceptionMessage": "Error en el documento XML (1, 771).", 
     "ExceptionType": "System.InvalidOperationException", 
     "StackTrace": " en System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)\r\n en System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)", 
     "InnerException": { 
      "Message": "Error.", 
      "ExceptionMessage": "La cadena de entrada no tiene el formato correcto.", 
      "ExceptionType": "System.FormatException", 
      "StackTrace": " en System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)\r\n en System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)\r\n en System.Xml.Serialization.XmlSerializationReader.ReadTypedPrimitive(XmlQualifiedName type, Boolean elementCanBeType)\r\n en System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, Boolean elementCanBeType, String& fixupReference)\r\n en Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderWSCalculadoraPortType.Read1_Resp_Cotizar()\r\n en System.Xml.Serialization.XmlSerializationReader.ReadReferencingElement(String name, String ns, Boolean elementCanBeType, String& fixupReference)\r\n en Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderWSCalculadoraPortType.Read5_wsCotizarResponse()\r\n en Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Deserialize(XmlSerializationReader reader)\r\n en System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)" 
     } 
    } 
} 

回答

0

問題出在服務端,php服務沒有正確處理異常,所以服務本身因異常而失敗。

換句話說,CustomTextMessageEncoder /工作正常,但PHP服務中的代碼錯誤/寫得不好。