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.
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. –
Will Keep in my mind ... !! Grazie per i tuoi consigli –