2011-01-20 25 views
5


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);   
     } 
    } 

cevap

2

Bir IDispatchMessageInspector, tüm iletiler için çalışacak HTTP dahil unutmayın görünmektedir: Zarf varsa ve sürüm 1.1 varsa durumunda o zaman biz web yöntemi görüşmesi ve özel başlık eklenebilir oldukça emin olabilir Aynı son noktaya maruz kalan meta verilere (WSDL) yönelik talepler. Müfettişinizi nasıl kaydettiğinizden bahsetmiyorsunuz, bu da ilgili olabilir.

Bunu kontrol etmenin yanı sıra, mesajın içeriklerini kontrol etmeye çalıştınız mı? Örneğin, hizmet HTML sayfasını içeren bir mesajın MessageVersion == MessageVersion.None olması muhtemeldir. Benzer şekilde, mesajla ilişkili eylem de yararlı olabilir.

+1

Sorunu, serviceModel bölümü içeriğiyle yükselttim. –

+1

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

İlgili konular