2011-01-20 8 views
5


Nel mio progetto WCF ho bisogno di utilizzare intestazioni personalizzate nelle risposte così ho implementato IDispatchMessageInspector. Onestamente tutto funziona abbastanza bene, ma sono preoccupante per una piccola cosa.
Il problema è che entrambi BeforeSendReply e AfterReceiveRequest vengono attivati ​​anche quando apro il mio .svc come pagina o carico il servizio in WCF Test Client.
Quindi, la prima domanda : è normale? Ci sono alcuni modi per gestirlo in modo dichiarativo (forse qualche trucco web.config)?
Attualmente io uso codice successivo:IDispatchMessageInspector: miglioramento della funzionalità BeforeSendReply

public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if (reply.Properties.Any(x => x.Key == "httpResponse")) 
      return; 

     MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
     reply.Headers.Add(header);   
    } 

Così ora mi occupo di tutte le chiamate che non sono chiamate di servizio utilizzando che:

if (reply.Properties.Any(x => x.Key == "httpResponse")) 
    return; 

Ma sono abbastanza sicuro che ci e qualche altro modo migliore per gestire quel problema. Quindi la mia domanda principale : per favore suggeriscimi un modo migliore per gestire la situazione descritta.
Grazie in anticipo!

UPDATE 1
mio system.serviceModel sezione

<system.serviceModel>  
    <services>   
     <service behaviorConfiguration="someBehavior" name="serviceName"> 
      <endpoint address="" binding="basicHttpBinding" contract="my contract" /> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     </service> 
    </services>  
    <behaviors> 
     <serviceBehaviors>    
      <behavior name="someBehavior"> 
       <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>     
       <serviceDebug includeExceptionDetailInFaults="false"/> 
       <exceptionInspector/>     
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <extensions> 
     <behaviorExtensions> 
      <add name="exceptionInspector" type="class which implements BehaviorExtensionElement" /> 
     </behaviorExtensions> 
    </extensions> 

</system.serviceModel> 

UPDATE 2 (soluzione accettata)
ho trascorso qualche fonte indagini tempo di problema e alla fine ho trovato accettabile per me la soluzione .
Quindi, cosa ho trovato:
Prima di tutto Message è una classe astratta. Quindi, BeforeSendReply ogni volta ricevi tipi di messaggi concreti.
I più usati sono:
1) System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.MetadataOnHelpPageMessage - significa che il client apre svc come pagina. Risultato = nota pagina formattata in html con informazioni comuni sul servizio svc. Per questo tipo reply.Version.Envelope è EnvelopeVersion.None.
2) Richiesta di metadati. Questa è una parte un po 'complicata e dipende se usiamo MEX o no. Quindi, se utilizziamo MEX, la richiesta viene eseguita su endpoint .svc/mex e il suo tipo di messaggio sarà System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage con reply.Version.Envelope uguale a EnvelopeVersion.Soap12.
Nel caso in cui non si utilizzi MEX, il client esegue alcune richieste per ottenere dati wsdl. Il tipo di messaggio sarà XMLSchemaMessage.
3) Eseguire la richiesta del metodo Web. Questo è utile solo per me tipo di richieste. È System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage e ha reply.Version.Envelope uguale a EnvelopeVersion.Soap11.

Sto usando basicHttpBinding così la versione SOAP è 1.1. Quindi il mio codice finale dovrebbe solo verificare che la risposta abbia una busta SOAP e verificarne la versione. Nel caso in cui la busta esiste ed ha la versione 1.1, allora possiamo essere abbastanza sicuri che abbiamo metodo Web chiamata e intestazione personalizzata potrebbe aggiungere:

 public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     if(reply.Version.Envelope == EnvelopeVersion.Soap11) 
     {    
      MessageHeader header = MessageHeader.CreateHeader("Success", "NS", !reply.IsFault); 
      reply.Headers.Add(header);   
     } 
    } 

risposta

2

Mi pare di ricordare che un IDispatchMessageInspector verrà eseguito per tutti i messaggi, tra cui HTTP richieste ai metadati (WSDL), esposti allo stesso endpoint. Non menzioni come stai registrando il tuo ispettore, quindi potrebbe anche essere correlato.

Oltre a verificare che, hai provato a verificare che cosa contiene il messaggio? Ad esempio, un messaggio contenente la pagina HTML del servizio potrebbe avere MessageVersion == MessageVersion.None. Allo stesso modo, l'azione associata al messaggio potrebbe anche essere utile.

+1

Ho aggiornato la mia domanda con il contenuto della sezione serviceModel. –

+1

Ho aggiornato la mia domanda con la soluzione accettata. Quindi grazie per avermi spinto nella giusta direzione, le tue informazioni comuni su MessageVersion in generale erano corrette. –

Problemi correlati