Mientras se actualiza una referencia de servicio de mi cliente WCF (simplemente haciendo clic servicio de actualización de Referencia en Visual Studio 2008), de error siguientes:ContractFilter falta de coincidencia en el EndpointDispatcher (control de errores)
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 falta de concordancia de ContractFilter en EndpointDispatcher. Puede ser debido a una falta de coincidencia de contrato (acciones no coincidentes entre el remitente y el receptor ) o una falta de correspondencia/seguridad entre el emisor y el receptor . Compruebe que el remitente 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 (Excepción electrónico, mensaje Mensaje)
Antecedentes:
He creado ErrorServiceBehaviour
clase. Debido a que dicho comportamiento se crea para el manejo de errores, se debe aplicar IErrorHandler
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 mediante la aplicación de ErrorServiceBehavior
atributo a mi clase de servicio:
[ErrorServiceBehavior(FaultType = typeof(MyServiceFault))]
public class MyService : IMyService
{
...
}
La cosa es que cuando comento a cabo el método foreach
rizo interior ApplyDispatchBehavior
, me sale ninguna error en absoluto, pero esa no es la salida (porque quiero que se manejen mis errores).
A continuación se presenta mi servicio config:
<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?
ACTUALIZACIÓN
el código mostrado anteriormente:
foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(new ErrorHandler(_faultType));
}
añade error personalizado para el manejo de todos los puntos finales - incluyendo los metadatos uno. Pero en realidad esto es no el origen del problema, incluso cuando desactivo la adición de manejo de errores para el punto final de metadatos, el problema aún ocurre.
El otro aviso es, cuando cambio la bindingConfiguration
del primer punto final a DefaultBinding
, tengo sin error en absoluto:
<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 en tampoco lo que quiero - Todavía necesito problemático NoSecurityBinding
para trabajar.
Gracias de antemano.
Si bien su respuesta puede resolver la pregunta, siempre es mejor si puede proporcionar una descripción de cuál fue el problema y cómo lo resuelve su respuesta. Esta es una sugerencia para mejorar aún más esta y futuras respuestas. –
Lo tendré en mente ... !! Gracias por sus consejos –