9

Message Inspector を作成および構成して、WCF Rest HTTP 要求の認証を実行しようとしています。私は4.0を使用しているので、古いRequestInterceptorを希望どおりに動作させることができましたが、WCFスターターキットを避けようとしています。RequestInterceptor を使用する際の問題は、WebHttpBehavior によって提供される、本当に維持したい automaticFormatSelectionEnabled 機能を失ったことです。

したがって、私の質問は、WebHttpBehavior を引き続き使用し、その機能を維持するように Message Inspector を構成するにはどうすればよいかということです。

私のweb.configは次のようになります

    <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>
4

1 に答える 1

20

これを処理する 1 つの方法は、3 つのオブジェクトを作成することです。

  1. リクエスト/レスポンスの分析を担当するメッセージインスペクタ
  2. サービスの動作により、インスペクターがパイプラインに自動的に挿入されます
  3. 構成セクションでは、動作を web.config で使用できます。

まず、IDispatchMessageInspector を実装し、検証コードを AfterReceiveRequest メソッドに配置して、メッセージ インスペクターを作成します。

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
}

メッセージを読むときは、メッセージのバッファリングされたコピーを作成することが重要です。メッセージは 1 回しか開くことができず、コピーを作成しないとパイプの下で問題が発生します。私の ValidateHmac の実装は、失敗すると例外をスローします。これにより、実際のサービスが呼び出されなくなります。

次に、インスペクタの動作を作成します。この動作を使用して、インスペクターを WCF ランタイムに挿入します。動作を作成するには、IEndpointBehavior からクラスを派生させて、次のようにします。

 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
    }

インスペクター ( HmacVerificationInspector) の新しいインスタンスを作成し、それをプログラムでランタイムに挿入していることに注意してください。

最後に、構成セクションを作成します。これを使用して、Web 構成で動作を適用できます (したがって、構成を介してオンとオフを切り替えることができます)。新しいクラスを作成し、BehaviorExtensionElement と IServiceBehavior から継承します。

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

ここで、インスペクターを使用するには、web.config に以下を追加します (拡張機能の名前は任意に設定できます)。

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

まず、構成セクションを動作拡張に登録します。次に、その構成をエンドポイントの動作として使用します。これにより、インスペクターが自動的に挿入され、そのエンドポイントへのすべてのリクエストがインスペクターを介して実行されます。インスペクターをオフにする場合は、タグを削除するか、別のエンドポイント動作を選択してください。webHttp 動作の使用にも注意してください (これにより、automaticFormatSelectionEnabled.

お役に立てれば

于 2011-09-21T20:47:46.660 に答える