2010-08-11 49 views
29

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.

Respuesta

1

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

0

Por lo que dices parece que su nuevo servicio WCF no se requiere seguridad y en su NoSecurityBinding que lo apaga. Una forma de comprobar que es conseguir WSDL un archivo localmente 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 por el estilo de las importaciones. Estoy bastante seguro de que su servicio de WCF actualizada tiene habilitada la seguridad


Actualización 1

Para tener una mejor visión de su problema podría utilizar WCF Tracing. Aquí puede ver cómo activarlo y cómo leer las trazas: "How to turn on WCF tracing"

0

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

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

La configuración web.config existente 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.

0
<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> 
+2

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. –

+0

Lo tendré en mente ... !! Gracias por sus consejos –

1

Para empezar, noto su intento de obligar a un mexHttpBinding a un punto final a pesar de que nunca fue definido dentro de la etiqueta "Enlaces". 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> 

También, ya que al parecer no necesita ninguna función de seguridad, es posible que desee para favorecer basicHttpBinding. Como dice very thorough answer, wsHttpBinding es realmente útil cuando quiere 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> 

+0

Hola. Gracias por tu respuesta. Sin embargo, no voy a verificarlo ya que la pregunta fue hecha hace alrededor de 5 años. Sin embargo, lo aprecio. – jwaliszko

+0

Guau, surgió en las preguntas "no respondidas", no esperaba que el sistema impulsara temas tan antiguos. De todos modos, salud. –

1

Compruebe el App.Config y verifique que esté apuntando a su anfitrión servicio de Windows desplegado o configurarlo para que apunte a localhost.

Cuestiones relacionadas