2

IDispatchMessageInpector と IClientMessageInpector を実装して、AfterReceiveRequest メソッドと BeforeSendRequest メソッドのメッセージ オブジェクトを確認することを検討しています。私の要件は、WCF サービスのコード レベルで変更を加えることです。構成の変更はありません。この動作を、このサービスを呼び出しているすべてのエンドポイントとサービス自体にアタッチする方法。IContractBehaviour の実装は役に立ちますか?

編集 1: WCF サービスは IIS でホストされています。コードを介して動作を追加することは可能ですか?

編集 2: ServiceHostFactory を使用してこれを達成できるようです。Webconfig で定義されているクライアント エンドポイントに動作を追加するにはどうすればよいですか?

4

2 に答える 2

4

はい、IIS でホストされているサービスの動作を追加できます。動作は、サービスのホスティング環境には関係ありません。Carlos Figueira のブログでは、Service、Endpoints、Contracts、および Operations に適用できるあらゆる種類の動作の例を紹介しています。IIS でホストされているサービス用に試したサンプル コード (web.config ファイルで定義されたエンドポイントを使用) - ここの構成ファイルは、ExtensionElement として動作を追加する必要があります。

public class MyEndpointBehavior : BehaviorExtensionElement, IEndpointBehavior
{
            public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
            {
                Console.WriteLine("applying dispatch behavior");
                endpointDispatcher.DispatchRuntime.MessageInspectors.Add(new MyInspector());
                endpointDispatcher.DispatchRuntime.OperationSelector = new MyOperationSelector();
            }

        public void  AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
        {
        }

        public void  ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
        {
        }

        public void  Validate(ServiceEndpoint endpoint)
        {
        }

        public override Type BehaviorType
        {
            get {  return this.GetType(); }
        }

        protected override object CreateBehavior()
        {
           return new MyEndpointBehavior();
        }
}

    public class MyOperationSelector : IDispatchOperationSelector
    {
        public string SelectOperation(ref Message message)
        {
            Console.WriteLine("good luck");
            string action = message.Headers.Action;
            return action.Substring(action.LastIndexOf('/') + 1);
        }
    }

    public class MyInspector : IDispatchMessageInspector
    {

        public object AfterReceiveRequest(ref Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
        {
            return (Message) request;
        }

        public void BeforeSendReply(ref Message reply, object correlationState)
        {
        }
    }
 }

拡張要素として動作が追加された構成ファイル -

  <system.serviceModel>
  <services>
  <service name="RouteToServiceA.Service1">
    <endpoint address="Service1" binding="basicHttpBinding" contract="RouteToServiceA.IService1" behaviorConfiguration="testEndPoint" />
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
      <serviceMetadata httpGetEnabled="true" />
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="testEndPoint">
      <testBehavior />
    </behavior>
  </endpointBehaviors>
</behaviors>
<extensions>
  <behaviorExtensions>
    <add name="testBehavior" type="RouteToServiceA.MyEndpointBehavior, RouteToServiceA" />
  </behaviorExtensions>
</extensions>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
 </system.serviceModel>
于 2013-07-02T18:12:11.090 に答える