2011-06-10 28 views
9

'da StandardEndpoints kullanırken bir MessageInspector'ı nasıl yapılandırırsınız Bir WCF Rest HTTP isteğinin bazı kimlik doğrulaması gerçekleştirmek için bir Message Inspector oluşturup yapılandırmaya çalışıyorum. Ben eski bir RequestInterceptor istediğim şekilde çalışan almayı başarmış olmasına rağmen, WCF Starter Kit'inden emin olmak için 4.0 kullanıyorum. RequestInterceptor kullanımı ile ilgili sorun, gerçekten tutmak istediğim WebHttpBehavior tarafından sağlanan automaticFormatSelectionEnabled özelliklerini kaybettiğidir.WCF REST 4.0

Sorularım, Message Inspector'ı WebHttpBehavior yöntemini kullanmaya ve özelliklerini saklı tutmaya çalışacak şekilde nasıl yapılandırabilirim.

Benim web.config bu üç nesne yaratmaktır işleyebilir bu

<standardEndpoints> 
    <webHttpEndpoint> 
    <!-- the "" standard endpoint is used by WebServiceHost for auto creating a web endpoint. --> 
    <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" /> 
    <!-- Disable the help page for the directory end point--> 
    <standardEndpoint name="DirectoryEndpoint"/> 
    </webHttpEndpoint> 
</standardEndpoints> 

cevap

19

Tek yol gibi görünüyor. istek/yanıt

  • hizmet davranışı analiz sorumlu

    1. mesajı müfettişi, otomatik, boru hattı
    2. yapılandırma bölümü içine müfettiş enjekte davranış web kullanılmasını sağlar

    İlk IDispatchMessageInspector uygulanması ve sonra da doğrulama kodunu koyarak mesaj müfettiş oluşturmak .config ReceiveRequest yöntemi:

    public class HmacVerificationInspector : IDispatchMessageInspector 
    { 
    
        #region IDispatchMessageInspector Members 
    
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, 
         System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext) 
        { 
          MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
          request = buffer.CreateMessage(); 
          Message dupeRequest = buffer.CreateMessage(); 
    
          ValidateHmac(dupeRequest); 
    
          buffer.Close(); 
    
         return null; 
        } 
    
        public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, 
         object correlationState) 
        { 
    
    
        } 
    
        #endregion 
    } 
    

    Onu okurken mesajın bir tamponlu kopyasını oluşturmak önemlidir. Mesajlar sadece bir kez açılabilir ve bir kopya oluşturulmadığında borudan kaynaklanan sorunlara yol açacaktır. ValidateHmac uygulamam başarısız olursa bir istisna atar. Bu gerçek hizmetin çağrılmasını engeller.

    İkinci olarak, denetçiniz için bir davranış oluşturun. WCF çalışma zamanına denetçiyi enjekte etmek için davranışı kullanırız. Bu

    public class HmacVerificationBehavior : IEndpointBehavior 
        { 
         #region IEndpointBehavior Members 
    
         public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
         { 
    
         } 
    
         public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime) 
         { 
    
         } 
    
         public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) 
         { 
          HmacVerificationInspector inspector = new HmacVerificationInspector(); 
    
          endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector); 
         } 
    
         public void Validate(ServiceEndpoint endpoint) 
         { 
    
         } 
    
         #endregion 
        } 
    

    Bildirimi gibi benim denetçisi (HmacVerificationInspector) yeni bir örneğini oluşturmak ve çalışma zamanı içine programlı enjekte görünüyor böylece davranışı oluşturmak için, IEndpointBehavior bir sınıf türetmek. Son olarak, son adım bir yapılandırma bölümü oluşturmaktır. Bunu, davranışı web yapılandırmasında uygulamak için kullanabiliriz (böylece yapılandırmayla açıp kapatabiliriz). Yeni bir sınıf oluşturun ve BehaviorExtensionElement ve IServiceBehavior devralan:

    Şimdi
    public class HmacVerificationConfigurationSection : BehaviorExtensionElement, IServiceBehavior 
    { 
        #region IServiceBehavior Members 
    
        public void AddBindingParameters(ServiceDescription serviceDescription, 
         System.ServiceModel.ServiceHostBase serviceHostBase, 
         System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, 
         System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
        { 
    
        } 
    
        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
        { 
    
        } 
    
        public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase) 
        { 
    
        } 
    
        #endregion 
    
        public override Type BehaviorType 
        { 
         get { return typeof(HmacVerificationBehavior); } 
        } 
    
        protected override object CreateBehavior() 
        { 
         return new HmacVerificationBehavior(); 
        } 
    } 
    

    , denetçisini kullanın, web.config aşağıdakileri ekleyin

    (ne istersen için uzatma adını ayarlayabilirsiniz)
    <system.serviceModel> 
         <extensions> 
          <behaviorExtensions> 
           <add name="hmacVerification" type="NamespaceHere.HmacVerificationConfigurationSection, AssembleyHere, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> 
          </behaviorExtensions> 
         </extensions> 
         <services> 
          <service name="MySecureService"> 
           <endpoint address="" binding="webHttpBinding" contract="IMySecureService" behaviorConfiguration="web" /> 
          </service> 
         </services> 
         <behaviors> 
          <endpointBehaviors> 
           <behavior name="web"> 
            <webHttp automaticFormatSelectionEnabled="true" />   
            <hmacVerification /> 
           </behavior> 
          </endpointBehaviors> 
          <serviceBehaviors> 
           <behavior name=""> 
            <serviceMetadata httpGetEnabled="true" /> 
            <serviceDebug includeExceptionDetailInFaults="false" /> 
           </behavior> 
          </serviceBehaviors> 
         </behaviors> 
         <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
        </system.serviceModel> 
    

    Her şeyden önce, ilk önce davranış bölümündeki yapılandırma bölümünü kaydedin. Daha sonra, bu yapılandırmayı daha sonra denetçiyi otomatik olarak enjekte edecek bir son nokta davranışı olarak kullanırsınız ve bu son noktaya yönelik tüm istekler denetçinizden geçer. Müfettişi kapatmak isterseniz, etiketi kaldırın veya farklı bir son nokta davranışı seçin. Ayrıca webHttp davranışının kullanıldığına dikkat edin (bu, otomatikFormatSelectionEnabled özelliğini korumanıza olanak tanır).

    Yardım etmek ister misiniz? Bu,

  • +0

    konusunda yardımcı olabilir. – control

    +0

    Aksine onun çok yararlı olduğunu düşünüyorum. Teşekkürler. – Barun

    +0

    Wcf mesajı hakkında daha iyi yazı çok zaman geçirdim. Çok teşekkür ederim. –