wfc visual usa tipo test studio prueba porque operacion esta crear consumir cliente admite c# wcf soap wcf-client

c# - usa - wcf test client visual studio 2017



Consumir un error SOPC no wcf del cliente WCF(error definido) (2)

Si ha intentado hacer algo como el código que se muestra a continuación, debe detectar el contrato de falla de jabón específico que tiene la información que está buscando. La información en este artículo de MSDN debería ayudar.

var proxy = new WhatEverYourServiceProxyClassIsNamed(); try { //your call logic here proxy.Close(); } catch (FaultException<BtsSoapException> bse) { //Get the info you''re looking for in the strongly typed soap fault: proxy.Abort(); } catch (FaultException fe) { //Do something appropriate for a non-typed soap fault proxy.Abort(); } finally { if ((ICommunicationObject)proxy).State != CommunicationState.Closed) proxy.Abort(); }

Tengo un servidor que no es wcf al que llamo desde el cliente WCF y necesito obtener acceso a un error de soap registrado en caso de que el servidor lo arroje (contiene los comentarios que necesito para el usuario). Utilicé el ejemplo de Cómo acceder al detalle de fallo de SOAP 1.1 del cliente WCF (sin contrato de falla) pero es un problema dado DO DO tengo el contrato de falla definido en el wsdl, al menos por especificación SOAP y el error contiene código de error y cadena de error .

<wsdl:types> <schema elementFormDefault="qualified" targetNamespace="http://www.cisco.com/BTS10200/i01" xmlns="http://www.w3.org/2001/XMLSchema"> ... <complexType name="BtsSoapException"> <sequence> <element name="error_code" type="xsd:int"/> <element name="error_string" nillable="true" type="xsd:string"/> </sequence> </complexType> <element name="fault" type="impl:BtsSoapException"/> ... <wsdl:message name="BtsSoapException"> <wsdl:part element="impl:fault" name="fault"/> </wsdl:message> ... <wsdl:portType name="Bts10200Operations"> <wsdl:operation name="login"> <wsdl:input message="impl:loginRequest" name="loginRequest"/> <wsdl:output message="impl:loginResponse" name="loginResponse"/> <wsdl:fault message="impl:BtsSoapException" name="BtsSoapException"/> </wsdl:operation> ...

La importación del servicio reconoce todo esto correctamente y genera las construcciones de código adecuadas:

[System.Runtime.Serialization.DataContractAttribute(Name="BtsSoapException", Namespace="http://www.cisco.com/BTS10200/i01")] [System.SerializableAttribute()] public partial class BtsSoapException : object ... .... [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cisco.com/BTS10200/i01", ConfigurationName="CiscoBTSService.Bts10200Operations")] public interface Bts10200Operations { [System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")] [System.ServiceModel.FaultContractAttribute(typeof(TestCiscoBTS.CiscoBTSService.BtsSoapException), Action="", Name="fault")] TestCiscoBTS.CiscoBTSService.loginResponse login(TestCiscoBTS.CiscoBTSService.loginRequest request); ...

Cuando llamo al login() con una cuenta no válida, SÍ recibo la respuesta adecuada según wsdl:

<?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> <soapenv:Fault> <faultcode>soapenv:Server.generalException</faultcode> <faultstring></faultstring> <detail> <ns1:fault xmlns:ns1="http://www.cisco.com/BTS10200/i01"> <error_code>401</error_code> <error_string xsi:type="xsd:string">java.lang.Exception: No user profile defined in the database for fakeuser</error_string> </ns1:fault> <ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">com.sswitch.oam.soap.intf.BtsSoapException</ns2:exceptionName> <ns3:stackTrace xmlns:ns3="http://xml.apache.org/axis/"> at com.sswitch.oam.soap.impl.UserAuth.validateUser(UserAuth.java:63) ...

La FaultExcpetion , sin embargo, está en blanco ( Message = "") y no veo ninguna propiedad que exponga la instancia de BtsSoapException. Al igual que no se ha deserializado en absoluto (a pesar de que wcf sabe todo lo que necesita para hacerlo). ¿Qué estoy haciendo mal? ¿Cómo hago que WCF me dé FaultException<BtsSoapException> ?


Creo que Sixto Saez tiene razón. Puede ver la instancia de BtsSoapException dentro de FaultException.

Definición:

<complexType name="BtsSoapException"> <sequence> <element name="error_code" type="xsd:int"/> <element name="error_string" nillable="true" type="xsd:string"/> </sequence> </complexType>

Respuesta:

<detail> <ns1:fault xmlns:ns1="http://www.cisco.com/BTS10200/i01"> <error_code>401</error_code> <error_string xsi:type="xsd:string">java.lang.Exception: No user profile defined in the database for fakeuser</error_string>

si lo haces

catch (FaultException<BtsSoapException> bse) { console.write(bse.Detail.error_string) }

debe ver "java.lang.Exception: ningún perfil de usuario definido en la base de datos para fakeuser" en la ventana de salida cuando está depurando.