2010-08-11 4 views
29

Bien que la mise à jour d'une référence de service de mon client WCF (en cliquant Update Service de référence dans Visual Studio 2008), l'erreur suivante se produit:ContractFilter non-concordance au EndpointDispatcher (de la gestion des erreurs)

System.ServiceModel. FaultException: le message avec action « http://schemas.xmlsoap.org/ws/2004/09/transfer/Get » ne peut pas être traité au niveau du récepteur, en raison d'un décalage de ContractFilter à la EndpointDispatcher. Cela peut être en raison d'une non-concordance de contrat (Actions non concordantes entre l'expéditeur et le destinataire ) ou d'une non-concordance/sécurité entre l'expéditeur et le destinataire . Vérifiez que l'expéditeur et le destinataire ont le même contrat et la même liaison (y compris les exigences de sécurité , par exemple Message, Transport, Aucun). à System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch (Exception e , un message du message)

Contexte:

J'ai créé la classe ErrorServiceBehaviour. Parce qu'un tel comportement est créé pour la gestion des erreurs, l'implémentation IErrorHandler doit être appliquée à chaque 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;   
    } 
    ... 
} 

Plus tard, je l'ai utilisé que le comportement en appliquant ErrorServiceBehavior attribut à ma classe de service:

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

La chose est, quand je commente la boucle foreach intérieur méthode ApplyDispatchBehavior, je reçois pas erreur du tout, mais ce n'est pas le moyen de sortir (parce que je veux que mes erreurs soient traitées).

Ci-dessous il y a ma config de service:

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

quelqu'un peut me aider?

MISE À JOUR

Le code indiqué précédemment:

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

ajoute la gestion des erreurs de mesure pour tous les paramètres - y compris les métadonnées d'un. Mais en réalité c'est pas la source du problème - même si je désactive l'ajout de la gestion des erreurs pour le point de terminaison de métadonnées, le problème se produit toujours.

L'autre avis est, quand je change la bindingConfiguration du premier point final à DefaultBinding, je aucune erreur du tout:

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

Une telle option pas non plus ce que je veux - je dois encore problématique NoSecurityBinding pour fonctionner.

Merci d'avance.

Répondre

1

Regardez dans le IExtensibleDataObject, il est utilisé pour gérer les différentes versions d'un service Web qui peuvent encore communiquer entre eux. De cette façon, les contrats n'ont pas besoin de correspondre exactement. J'espère que cela t'aides.

0

Sur ce que vous dites, il semble que votre nouveau service WCF ne nécessitent la sécurité et dans votre NoSecurityBinding vous l'éteignez. Un moyen de vérifier est d'obtenir fichier WSDL un de voir localement si elle a: http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd ou http://schemas.xmlsoap.org/ws/2004/09/policy ou quelque chose comme ça dans les importations. Je suis assez sûr que votre service de mise à jour WCF sécurité est activée


Update 1

Pour obtenir une meilleure vision de votre problème, vous pouvez utiliser WCF Tracing. Ici vous pouvez voir comment l'allumer et comment lire ces traces: "How to turn on WCF tracing"

0

Je ne pense pas que vous éteignez complètement la sécurité. Essayez ceci:

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

Le paramètre web.config existant peut créer un problème car ils sont pour la version précédente. Mieux vaut supprimer la référence existante de votre application cliente WCF et ajouter à nouveau la référence.

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

Bien que votre réponse puisse résoudre la question, il est toujours préférable de fournir une description du problème et de la façon dont votre réponse l'a résolu. Ceci est une suggestion pour améliorer encore ceci et les réponses futures. –

+0

Je le garderai dans mon esprit ... !! Merci pour vos conseils –

1

Pour commencer, je remarque votre tentative de lier un mexHttpBinding à un point final bien qu'il n'a jamais été défini dans votre tag « bindings ». Cela devrait constituer une exception, et je m'attendrais à ce qu'une telle exception ressemble à celle qui vous dérange.

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

De plus, comme vous n'avez apparemment pas besoin de fonctionnalités de sécurité, vous pouvez préférer basicHttpBinding. Comme ce very thorough answer états, wsHttpBinding est vraiment utile lorsque vous veulent des fonctions de sécurité.

Votre configuration serait presque la même, en changeant "ws" pour "basic".

<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

Salut. Merci pour votre réponse. Je ne vais pas le vérifier bien que la question ait été posée il y a environ 5 ans. Néanmoins, je l'apprécie. – jwaliszko

+0

Wow, c'est apparu dans les questions "pas répondu", je ne m'attendais pas à ce que le système pousse de si vieux sujets. Quoi qu'il en soit, applaudissements. –

1

Vérifiez la App.Config et vérifiez qu'il pointe vers votre déploiement hôte de service Windows ou mis à pointer vers localhost.