2010-08-11 5 views
29

Durante l'aggiornamento un riferimento al servizio del mio cliente WCF (semplicemente cliccando Update Service Reference in Visual Studio 2008), a seguito di errore si verifica:ContractFilter non corrispondente al EndpointDispatcher (gestione degli errori)

System.ServiceModel. FaultException: il messaggio con azione 'http://schemas.xmlsoap.org/ws/2004/09/transfer/Get' non può essere elaborato al ricevitore, a causa di una mancata corrispondenza ContractFilter al l'EndpointDispatcher. Questo può essere a causa di una mancata corrispondenza o contratto di (azioni non corrispondenti tra il mittente e il ricevitore) o un legame/sicurezza mancata corrispondenza tra il mittente e il destinatario . Verificare che il mittente e il ricevitore abbiano lo stesso contratto e lo stesso numero di telefono (compresi i requisiti di sicurezza , ad esempio Messaggio, Trasporto, Nessuno). a System.ServiceModel.Dispatcher.ErrorBehavior.ThrowAndCatch (eccezione e, messaggio Messaggio)

Background:

ho creato ErrorServiceBehaviour classe. Poiché tale comportamento viene creato per la gestione degli errori, è necessario applicare l'implementazione IErrorHandler a ogni 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;   
    } 
    ... 
} 

Più tardi, ho usato che il comportamento applicando attributo ErrorServiceBehavior alla mia classe di servizio:

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

Il fatto è che quando io commento la foreach ciclo all'interno ApplyDispatchBehavior metodo, ottengo no errore, ma non è la via d'uscita (perché voglio che i miei errori siano gestiti).

Di seguito è il mio config servizio:

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

qualcuno può aiutarmi?

UPDATE

il codice mostrato in precedenza:

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

aggiunge la gestione di errore personalizzato per tutti gli endpoint - tra cui i metadati uno. Ma in realtà questo è non l'origine del problema - anche quando disabilito l'aggiunta della gestione degli errori per l'endpoint dei metadati, il problema si verifica ancora.

L'altro avviso è, quando cambio la bindingConfiguration del primo endpoint per DefaultBinding, non ho non errore affatto:

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

Tale opzione, inoltre, non quello che voglio - ho ancora bisogno problematico NoSecurityBinding al lavoro.

Grazie in anticipo.

risposta

1

Esaminare lo IExtensibleDataObject, è utilizzato per gestire versioni diverse di un servizio Web ancora in grado di comunicare tra loro. In questo modo i contratti non devono necessariamente corrispondere. Spero che questo ti aiuti.

0

Su quello che dici sembra che il nuovo servizio WCF richiedono sicurezza e nella vostra NoSecurityBinding si spegne. Un modo per controllare che è quello di ottenere WSDL file localmente un vedere se ha: 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 qualcosa di simile nelle importazioni. Sono abbastanza sicuro che il vostro servizio WCF aggiornato ha la sicurezza abilitata


Update 1

Per avere una migliore visione del problema si potrebbe usare WCF Tracing. Qui puoi vedere come accenderlo e come leggere le tracce: "How to turn on WCF tracing"

0

Non penso che tu stia disattivando completamente la sicurezza. Prova questo:

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

esistente impostazione web.config può creare un problema in quanto sono per la versione precedente. È meglio rimuovere il riferimento esistente dall'applicazione client WCF e aggiungere di nuovo il riferimento.

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

Mentre la tua risposta può risolvere la domanda, è sempre meglio se puoi fornire una descrizione di quale fosse il problema e come la tua risposta lo risolva. Questo è un suggerimento per migliorare ulteriormente questa e le future risposte. –

+0

Will Keep in my mind ... !! Grazie per i tuoi consigli –

1

Per cominciare, ho notato la tua tenta di associare un mexHttpBinding ad un endpoint, anche se non è mai stato definito all'interno del tag "Associazioni". Questo dovrebbe sollevare un'eccezione e mi aspetto che un'eccezione simile assomigli a quella che ti dà fastidio.

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

Inoltre, dal momento che voi non pare bisogno di alcuna funzione di sicurezza, si potrebbe desiderare di favorire basicHttpBinding. Poiché questo stato very thorough answer, wsHttpBinding è davvero utile quando si utilizza per le funzionalità di sicurezza.

La tua configurazione finirebbe per essere quasi la stessa, cambiando "ws" per "base".

<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

Ciao. Grazie per la tua risposta. Non ho intenzione di verificarlo anche se la domanda è stata fatta circa 5 anni fa. Tuttavia lo apprezzo. – jwaliszko

+0

Wow, è apparso nelle domande "non risposte", non mi aspettavo che il sistema spingesse argomenti così vecchi. Ad ogni modo, evviva. –

1

Controllare la App.Config e verificare che si sta puntando al vostro ospite servizio di Windows distribuito o impostarla per puntare a localhost.