2017-03-15 9 views
0

WCFサービスを使用しており、承認に関する機能を追加する必要があります。 ServiceAuthorizationManagerから継承し、app.configに追加したクラスを作成しました。それは正常に動作しています。IDispatchMessageInspectorがWCFサービスを使用していない

また、IDispatchMessageInspectorを実装するクラスを実装する必要があるため、メッセージの検証を行うこともできます。

私はthisthisthisthisthisおよびいくつかの他のような多くの例が続いています。 SOのthisのような質問もあります。

これらはすべてapp.configファイルで同じ設定になっているようです。しかし、それを試してコードを実行すると、デバッグ時にIDispatchMessageInspectorを実装するクラスが呼び出されることはありません。私はブレークポイントを追加しましたが、決してヒットしません。

明らかなものがありませんか?

<extensions> 
    <behaviorExtensions> 
    <add name="MessageInspectorBehaviourExtension" type="MultipleEndpoints.MessageInspectorBehaviourExtension, RL_Managed_Service" /> 
    </behaviorExtensions> 
</extensions> 
<behaviors> 
<serviceBehaviors> 
    <behavior name="RLServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="False"/> 
     <serviceAuthorization serviceAuthorizationManagerType="MyProject.Services.AuthorizationService,MyProject"/> 
     <MessageInspectorBehaviourExtension /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="RLServiceBehavior" name="MultipleEndpoints.RL_Managed_Service"> 
    <endpoint address="" binding="basicHttpBinding" contract="MultipleEndpoints.container_db_ops" bindingConfiguration="TransportSecurity"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <host> 
     <baseAddresses> 
     <!-- --><add baseAddress="http://localhost:49224/My_Service/"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

答えて

1

設定を修正した後、理由を知っていると思います。ビヘイビア拡張をサービス動作として登録しようとしますが、IDispatchMessageInspectorはエンドポイントレベルで登録する必要があります(link you mentionedのように - 最後の例を参照)。ここ はあなたのために働く必要がある設定ファイルです:

<extensions> 
    <behaviorExtensions> 
    <add name="MessageInspectorBehaviourExtension" type="MultipleEndpoints.MessageInspectorBehaviourExtension, RL_Managed_Service" /> 
    </behaviorExtensions> 
</extensions> 
<behaviors> 
    <serviceBehaviors> 
    <behavior name="RLServiceBehavior"> 
     <serviceDebug includeExceptionDetailInFaults="False"/> 
     <serviceAuthorization serviceAuthorizationManagerType="MyProject.Services.AuthorizationService,MyProject"/> 
    </behavior> 
    </serviceBehaviors> 
    <endpointBehaviors> 
    <behavior name="RLEndpointBehavior"> 
     <MessageInspectorBehaviourExtension /> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 
<services> 
    <service behaviorConfiguration="RLServiceBehavior" name="MultipleEndpoints.RL_Managed_Service"> 
    <endpoint address="" binding="basicHttpBinding" behaviorConfiguration="RLEndpointBehavior" contract="MultipleEndpoints.container_db_ops" bindingConfiguration="TransportSecurity"/> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
    <host> 
     <baseAddresses> 
     <!-- --><add baseAddress="http://localhost:49224/My_Service/"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
+0

この投稿に間違いがあっただけです。 –

+0

詳細は私の答えを更新しました –

+0

私は 'serviceBehaviors'と' endpointBehaviors'を混ぜ合わせていないことを100%確信していました。おそらくこれは私の問題でした。 –

0

私はapp.configなしIDispatchMessageInspectorを登録することができ、別の方法を見つけました。 `OnStart 'メソッドでは、単にエンドポイントをループすることができます。

service = New ServiceHost(GetType(My_Service)) 

For Each endpoint In service.Description.Endpoints 
    If Not endpoint.Contract.Name.Equals("IMetadataExchange") Then 
     endpoint.EndpointBehaviors.Add(New MessageInspectorBehaviour) 
    End If 
Next 
関連する問題