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.
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. –
Je le garderai dans mon esprit ... !! Merci pour vos conseils –