В принципе, вам необходимо создать собственное поведение для вашего перехватчика. Процесс довольно indepth, поэтому вот ссылка, вместо того, чтобы набирать все это.
http://msdn.microsoft.com/en-us/magazine/cc163302.aspx
Основные шаги:
Создание пользовательского поведения
public class AuthorizationInterceptorBehavior: IEndpointBehavior, IServiceBehavior
{
//Code removed
...
}
Создание BehaviorExtension:
public class AuthorizationInterceptorBehaviorExtensionElement : BehaviorExtensionElement
{
public override Type BehaviorType
{
get
{
return typeof(AuthorizationInterceptorBehavior);
}
}
protected override object CreateBehavior()
{
return new AuthorizationInterceptorBehavior();
}
}
}
Затем создать свой перехватчик и поместить весь код в методе AfterReceivedRequest:
public class AuthorizationInterceptor : IDispatchMessageInspector
{ //This class implements the IDispatchMessageInspector which provides the basic access to each message when it is received
//by the service and before is sent back to the client
#region IDispatchMessageInspector Members
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
//YOUR CODE HERE
...}
Тогда вы просто добавить перехватчик в файл конфигурации:
<system.serviceModel>
<extensions>
<behaviorExtensions>
<add name="authorizationInterceptor" type="YOUR.ASSEMBLY.AuthorizationInterceptorBehaviorExtensionElement, YOUR.ASSEMBLY, Version=X.X.X.X, Culture=neutral, PublicKeyToken=XXXXXXXXXX" />
</behaviorExtensions>
</extensions>
</extensions>
<behaviors>
<serviceBehaviors>
<behavior name="SomeServiceBehavior">
<authorizationInterceptor />
...
Если вам нужна дополнительная помощь или руководство, комментарий, и я вернусь к вам с большим количеством деталей. Самая сложная часть работает с входящим запросом, поскольку в данный момент она не десериализована, поэтому вам нужно работать с ней как POX (Plain Ol 'Xml).
Ok, спасибо. Просто для подтверждения, IDispatchMessageInspector запускается перед чтением маркера безопасности? А как проложить маршрут между разными конечными точками? Как я знаю, IMessageInspector применяется к DispatchRuntime, которое в свою очередь относится к конечной точке. –
Значок безопасности - довольно общий термин, когда речь заходит о веб-сервисах, не могли бы вы рассказать о том, какой маркер безопасности вы пытаетесь использовать и как вы авторизуете эти «разные учетные данные»? – CkH