2011-01-27 5 views
1

J'ai un problème dans WCF qui me rend fou. Il est:Problème de déploiement WCF

Le message avec ne peut pas être traité au niveau du récepteur Action « GetUserByUserNameAndPassword », en raison d'un décalage de ContractFilter au EndpointDispatcher. Cela peut être dû soit à une non-concordance de contrat (Actions non concordantes entre l'expéditeur et le destinataire), soit à une non-concordance de liaison/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, Aucune).

La configuration est la suivante. J'ai un serveur Web exécutant un site Web client dans IIS 7 qui essaie de communiquer en utilisant WCF à un autre serveur qui a SQL Server et un service WCF hébergé dans IIS 7.

Ces deux machines sont sur le même domaine.

Pour essayer de le réduire à néant, je suis en train d'essayer de travailler sans sécurité. La configuration client ressemble à ceci:

<bindings> 
    <wsHttpBinding> 
     <binding name="wsHttpBinding_Normal"> 
     <security mode="None"/> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

<client> 
    <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc" 
    binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal" 
    contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
    </endpoint> 
</client> 

Ensuite, sur le serveur de la configuration ressemble à ceci:

<bindings> 
    <wsHttpBinding> 
     <binding name="NormalTrafficBinding"> 
     <security mode="None"/> 
     </binding> 
    </wsHttpBinding> 
</bindings> 

<services> 
    <service name="DS.Service.ServiceImplementation.AuditLogger"> 
     <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc" 
     binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding" 
     contract="DS.Service.ServiceContracts.IAuditLogger"> 
      <identity> 
       <dns value="localhost" /> 
      </identity> 
     </endpoint> 
    </service> 
<services> 

La méthode elle-même ressemble à ceci:

[OperationContract(IsTerminating = false, IsInitiating = true, IsOneWay = false, AsyncPattern = false, Action = "GetUserByUserNameAndPassword")] 
    [FaultContract(typeof(DS.Service.FaultContracts.DSOfficeFault))] 
    System.Data.DataSet GetUserByUserNameAndPassword(string userName, string password); 
+0

hasard vous avez mis à jour un code côté serveur, et oublié de mettre à jour/recréez le proxy côté client pour ce serveur sur une autre machine? –

Répondre

1

Vous devez définir la même contrat aux deux extrémités (serveur et client). Même s'ils s'appellent tous deux IAuditLogger, ils peuvent avoir des signatures différentes. Essayez de placer une seule classe IAuditLogger dans un assembly séparé, puis référencez-la dans les deux fichiers de configuration ou assurez-vous que les deux IAuditLogger ont les mêmes méthodes.

Vous pourriez avoir quelque chose comme:

<client> 
<endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc" 
binding="wsHttpBinding" bindingConfiguration="wsHttpBinding_Normal" 
contract="AuditLogger.IAuditLogger" name="wsHttpBinding_IAuditLogger"> 
    <identity> 
     <dns value="localhost" /> 
    </identity> 
</endpoint> 

Et

<services> 
<service name="DS.Service.ServiceImplementation.AuditLogger"> 
    <endpoint address="http://192.168.1.10:3026/DS.Service/AuditLogger.svc" 
    binding="wsHttpBinding" bindingConfiguration="NormalTrafficBinding" 
    contract="AuditLogger.IAuditLogger"> 
     <identity> 
      <dns value="localhost" /> 
     </identity> 
    </endpoint> 
</service> 

+0

Non, ce n'est pas vrai ** - si vous utilisez un standard "Add Service Reference" de Visual Studio, le proxy côté client sera généré dans un espace de noms distinct, et le contrat sera le même (en termes de il est sérialisé), mais il vit dans un espace de noms séparé côté client! –

+0

Vous avez raison, ce n'est pas une exigence. Très probablement, les deux interfaces qu'il utilise ont une signature différente qui causerait le problème. La solution est la même que je peux corriger le texte si c'est le cas. – Alex