我们正在使用Message Inspector通过在客户端添加一些信息并在服务器端检索添加的信息来自定义SOAP消息。 我们还使用自定义授权管理器,使用ServiceAuthorizationManager来使用检索到的基于SOAP的消息信息。
要自定义SOAP消息,我们将覆盖两种方法:
a)BeforeSendRequest(客户端) - 此方法用于在Message Inspector中自定义SOAP消息头。
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel)
{
Dictionary<string,string> headerInfo = new Dictionary<string,string>();
headerInfo.Add("UserId","1111");
MessageHeader header = MessageHeader.CreateHeader("LocalName", "NamespaceURI", headerInfo);
request.Headers.Add(header);
return null;
}
b)AfterReceiveRequest(服务器端) - 此方法用于在Message Inspector中获取自定义的SOAP消息。
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
Dictionary<string, string> headerInfo = request.Headers.GetHeader<Dictionary<string, string>>("LocalName", "NamespaceURI");
return null;
}
现在,当从客户端发出请求时,首先在Custom Authorization Manager类中调用,而不是在Server端的Message Inspector中调用AfterReceiveRequest()。
我们已在App.config文件中注册了自定义授权管理器,如下所示:
<serviceBehaviors>
<behavior name="SampleAuthorizationService.Service1Behavior">
<serviceMetadata httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
<serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="SampleAuthorizationSecurity.CustomAuthorizationManager, SampleAuthorizationSecurity">
<authorizationPolicies>
<add policyType="SampleAuthorizationSecurity.CustomAuthPolicy, SampleAuthorizationSecurity"/>
</authorizationPolicies>
</serviceAuthorization>
</behavior>
</serviceBehaviors>
流程应该从Message Inspector到服务器端的Custom Authorization Manager。但是,在我们的例子中,流程正好相反,即从Custom Authorization Manager到Message Inspector。 由于在App.config中注册自定义授权管理器,可能会发生这种情况。
任何人都可以帮我改变从服务器端的Message Inspector到Custom Authorization Manager的流程吗?
答案 0 :(得分:0)
我无法找到在Service Authorization Manager之前调用Message Inspector的方法,因此我通过在Service Authorization Manager中重新定义方法CheckAccess(OperationContext operationContext, ref Message message)
并完成此方法中的所有工作来解决此问题。它不是一个漂亮的解决方案,但它可以完成工作:)