WCF projemde, yanıtlarda özel başlık kullanmam gerekiyor, bu yüzden IDispatchMessageInspector uygulamıyorum. Dürüst olmak gerekirse, her şey çok güzel, ama küçük bir şey hakkında rahatsız ediyorum.
Buradaki şey, .Svc'yi sayfa olarak açtığımda veya WCF Test İstemcisine hizmet yüklediğimde bile hem BeforeSendReply hem de AfterReceiveRequest öğesinin patlaması.
İlk soru: Bu davranış normal mi? Bu bildiriyi işlemek için bazı yollar var mı (belki bazı web.config hilesi)? Bunu kullanarak hizmet çağrıları olmayan tüm çağrıları ŞimdiIDispatchMessageInspector: BeforeSendReply işlevinin iyileştirilmesi
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);
}
:
if (reply.Properties.Any(x => x.Key == "httpResponse"))
return;
Ama bazı başka ve daha iyi bir yolu var eminim
Şu anda bir sonraki kodu kullanabilirsiniz Bu sorunu çözmek için. ana sorumlusu: Lütfen bana açıklanan durumu işlemek için daha iyi bir yol öner.
Şimdiden teşekkürler!
GÜNCELLEME 1
Benim System.ServiceModel bölüm
<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>
GÜNCELLEME 2 (KABUL ÇÖZÜM)
Sorunun bir süre soruşturma kaynağını geçirdi ve nihayet benim çözüm için kabul edilebilir buldum .
Peki ne buldum:
Her şeyden önce Message
soyut bir sınıftır. Yani her zaman BeforeSendReply
defferent somut mesajlar alırsınız.
En çok kullanılanlar şunlardır:
1) System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.MetadataOnHelpPageMessage
- istemci sayfa olarak svc'yi açar. Sonuç = svc servisi hakkında genel bilgiler içeren iyi bilinen html formatlı sayfa. Bu tür için reply.Version.Envelope
, EnvelopeVersion.None
'dur.
2) Meta veri isteği alın. Bu biraz zor kısmı ve MEX kullanıyor veya kullanmamıza bağlı. Öyleyse, MEX kullanırsak, .svc/mex bitiş noktası için gerçekleştirme isteğini ve İleti türü EnvelopeVersion.Soap12
'a eşit olacaktır.
MEX'i kullanmıyorsak, istemci wsdl verisi almak için birkaç istek gerçekleştirir. Mesaj tipi XMLSchemaMessage
olacaktır.
3) Web yöntemi isteğini yürütün. Bu sadece benim için istek türleri için yararlıdır. System.ServiceModel.Dispatcher.OperationFormatter.OperationFormatterMessage
ve EnvelopeVersion.Soap11
'a eşit reply.Version.Envelope
vardır.
TemelHttpBinding kullanıyorum SOAP sürümü 1.1. Bu yüzden son kodum sadece kontrol etmelidir, cevabın SOAP zarfı vardır ve versiyonunu kontrol et.
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);
}
}
Sorunu, serviceModel bölümü içeriğiyle yükselttim. –
Sorumu kabul edilmiş bir çözümle güncelledim. Bu yüzden beni doğru yönde zorladığınız için teşekkürler, MessageVersion hakkındaki genel bilgileriniz doğruydu. –