visual usuario tipos que programacion por net más manejo manejar existen excepciones específicos elevar definidas comunes como asp c# .net wcf web-services

usuario - que tipos de excepciones existen en c#



ContractFilter no coincide en el EndpointDispatcher(manejo de errores) (7)

Al actualizar una referencia de servicio de mi cliente WCF (simplemente haciendo clic en Actualizar la referencia del servicio en Visual Studio 2008), se produce el siguiente error:

System.ServiceModel.FaultException: El mensaje con la acción '' http://schemas.xmlsoap.org/ws/2004/09/transfer/Get '' no se puede procesar en el receptor, debido a una discrepancia de ContractFilter en el EndpointDispatcher. Esto puede deberse a una discrepancia en el contrato (acciones no coincidentes entre el emisor y el receptor) o una falta de correspondencia vinculante / de seguridad entre el emisor y el receptor. Verifique que el emisor y el receptor tengan el mismo contrato y el mismo enlace (incluidos los requisitos de seguridad, por ejemplo, Mensaje, Transporte, Ninguno). en System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch (Exception e, Message message)

Fondo:

ErrorServiceBehaviour clase ErrorServiceBehaviour . Debido a que dicho comportamiento se crea para el manejo de errores, la implementación de IErrorHandler debe aplicarse a cada ChannelDispatcher .

public class ErrorServiceBehaviour : Attribute, IServiceBehavior { ... public Type FaultType { get { return _faultType; } set { _faultType = value; } } public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase) { foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType)); } } } public class ErrorHandler : IErrorHandler { public ErrorHandler(Type faultType) { _faultType = faultType; } ... }

Más tarde, he usado ese comportamiento al aplicar el atributo ErrorServiceBehavior a mi clase de servicio:

[ErrorServiceBehavior(FaultType = typeof(MyServiceFault))] public class MyService : IMyService { ... }

La cuestión es que cuando comento el bucle foreach dentro del método ApplyDispatchBehavior , no obtengo ningún error, pero esa no es la salida (porque quiero que se manejen mis errores).

A continuación está mi configuración de servicio:

<system.serviceModel> <services> <service behaviorConfiguration="DefaultBehavior" name="MyService"> <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="NoSecurityBinding"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <wsHttpBinding> <binding name="NoSecurityBinding" > <security mode="None"> <transport clientCredentialType="None"/> <message establishSecurityContext="false"/> </security> </binding> <binding name="DefaultBinding" /> </wsHttpBinding> </bindings> </system.serviceModel>

¿Alguien me puede ayudar?

ACTUALIZAR

El código mostrado anteriormente:

foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers) { dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType)); }

agrega manejo de errores personalizado para todos los puntos finales, incluido el de metadatos. Pero en realidad esta no es la fuente del problema: incluso cuando desactivo la adición de manejo de errores para el punto final de los metadatos, el problema persiste.

El otro aviso es que cuando cambio la bindingConfiguration de bindingConfiguration del primer punto final a DefaultBinding , no tengo ningún error:

<services> <service behaviorConfiguration="DefaultBehavior" name="MyService"> <endpoint address="" binding="wsHttpBinding" contract="IMyService" bindingConfiguration="DefaultBinding"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services>

Tal opción tampoco es lo que quiero, todavía necesito el NoSecurityBinding problemático para funcionar.

Gracias por adelantado.


En lo que dices parece que tu nuevo servicio WCF requiere seguridad y en tu NoSecurityBinding lo apagas . Una forma de verificar esto es obtener un archivo WSDL localmente y ver si tiene: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd o http://schemas.xmlsoap.org/ws/2004/09/policy o algo así en las importaciones. Estoy bastante seguro de que su servicio WCF actualizado tiene la seguridad habilitada

Actualización 1

Para obtener una mejor visión de su problema, puede usar el Seguimiento de WCF. Aquí puede ver cómo activarlo y cómo leer los rastreos: "Cómo activar el seguimiento de WCF"


La configuración existente de web.config puede crear un problema como lo son para la versión anterior. Es mejor eliminar la referencia existente de su aplicación de cliente WCF y Agregar la referencia nuevamente.


Mire en el IExtensibleDataObject , se usa para manejar diferentes versiones de un servicio web que aún puede comunicarse entre sí. De esta forma, los contratos no necesitan coincidir exactamente. Espero que esto ayude.


No creo que estés desactivando por completo la seguridad. Prueba esto:

<bindings> <wsHttpBinding> <binding name="NoSecurityBinding" > <security mode="None"> <transport clientCredentialType="None"/> <message clientCredentialType="None"/> </security> </binding> <binding name="DefaultBinding" /> </wsHttpBinding> </bindings>


Para empezar, noto que intentas unir un mexHttpBinding a un punto final, aunque nunca se definió dentro de tu etiqueta "Vinculaciones". Esto debería ser una excepción, y yo esperaría que esa excepción se parezca a la que te está molestando.

<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> ... <bindings> <mexHttpBinding> THIS TAG WAS MISSING (add security features as needed) </mexHttpBinding> <basicHttpBinding> <binding name="NoSecurityBinding" > <security mode="None" /> </binding> <binding name="DefaultBinding" /> </basicHttpBinding> </bindings>

Además, dado que aparentemente no necesita ninguna característica de seguridad, es posible que desee favorecer basicHttpBinding. Como dice esta respuesta muy completa , wsHttpBinding es realmente útil cuando se desean funciones de seguridad.

Su configuración terminaría siendo casi la misma, cambiando "ws" por "básico".

<system.serviceModel> <services> <service behaviorConfiguration="DefaultBehavior" name="MyService"> <endpoint address="" binding="basicHttpBinding" contract="IMyService" bindingConfiguration="NoSecurityBinding"/> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> </service> </services> <behaviors> <serviceBehaviors> <behavior name="DefaultBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors> <bindings> <basicHttpBinding> <binding name="NoSecurityBinding" > <security mode="None" /> </binding> <binding name="DefaultBinding" /> </basicHttpBinding> </bindings>


Verifique la App.Config y verifique que esté apuntando a su servidor de servicio de Windows desplegado o App.Config para que apunte a localhost .


<services> <service behaviorConfiguration="ServiceBehaviour" name="Service"> <endpoint address="" behaviorConfiguration="web" binding="webHttpBinding" contract="IService"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services>