Я относительно новичок в WCF и / но "похоже" уже получил большинство вещей и работает.
У меня есть следующие IEndpointBehavior и IClientMessageInspector, которые я хочу добавить при вызове сервиса.Он добавляет токен (HTTPHeader), который я хочу проверить на стороне сервера (IIS)
public class AuthenticationTokenEndpointBehavior : IEndpointBehavior
{
#region Member variables
public class AuthenticationTokenMessageInspector : IClientMessageInspector
{
public void AfterReceiveReply(ref Message reply, object correlationState)
{
//throw new NotImplementedException();
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
string token = AuthenticationTokenManager.CreateToken();
HttpRequestMessageProperty httpRequestMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
{
httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
}
else
{
httpRequestMessage = new HttpRequestMessageProperty();
request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
}
httpRequestMessage.Headers[AuthenticationTokenManager.AUTHENTICATION_TOKEN_NAME] = token;
return null;
}
#endregion
#region Methods
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
//throw new NotImplementedException();
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
AuthenticationTokenMessageInspector inspector = new AuthenticationTokenMessageInspector();
clientRuntime.MessageInspectors.Add(inspector);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
//throw new NotImplementedException();
}
public void Validate(ServiceEndpoint endpoint)
{
//throw new NotImplementedException();
}
#endregion
}
Я унаследовал и переопределил clientproxys CreateChannel, в который я добавляю свой IEndpointBehavior.
protected override ITheService CreateChannel()
{
this.Endpoint.Behaviors.Add(new AuthenticationTokenEndpointBehavior());
return base.CreateChannel();
}
Это работает очень хорошо для большинства моих привязок, кроме случаев использования <security mode="Message">
.Заголовки не отправляются на сервер.Я гуглил abit, но не нашел никакой информации об этой проблеме.
ОБНОВЛЕНИЕ 1: Чтобы уточнить, вызывается IClientMessageInspector.BeforeSendRequest, но на стороне сервера нет заголовков.
ОБНОВЛЕНИЕ 2: Я пыталсявместо этого добавьте SoapHeader (MessageHeader), но не повезло.Есть ли какое-то безопасное «рукопожатие» перед первым запросом ??