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);
}
}
Ho aggiornato la mia domanda con il contenuto della sezione serviceModel. –
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. –