Я пытаюсь настроить службу WCF, размещенную в IIS, в режиме совместимости ASP.Net, который защищен с помощью проверки подлинности с помощью форм и доступен через элемент управления .Net в IE. (см. Безопасная служба WCF, размещенная в IIS, для доступа через пользовательский элемент управления, размещенный в IE ).
Пользовательский элемент управления в IE необходим, поскольку он использует специальный сторонний элемент управления, для которого не существует ничего похожего в Silverlight или AJAX.
Поэтому мне нужно, чтобы UserControl установил куки аутентификации и идентификатора сеанса в заголовках http-запроса, прежде чем он получит доступ к службе WCF. Мой подход заключается в создании инспектора сообщений, который делает это.
Итак, я определил инспектора сообщений:
public class CookieInspector : IClientMessageInspector {
public void AfterReceiveReply(ref Message reply, object correlationState) {
}
public object BeforeSendRequest(
ref Message request,
IClientChannel channel) {
HttpRequestMessageProperty messageProperty;
if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name)) {
messageProperty = (HttpRequestMessageProperty) request.Properties[
HttpRequestMessageProperty.Name
];
}
else {
messageProperty = new HttpRequestMessageProperty();
request.Properties.Add(
HttpRequestMessageProperty.Name,
messageProperty
);
}
// Set test headers for now...
messageProperty.Headers.Add(HttpRequestHeader.Cookie, "Bob=Great");
messageProperty.Headers.Add("x-chris", "Beard");
return null;
}
}
и поведение конечной точки:
public class CookieBehavior : IEndpointBehavior {
public void AddBindingParameters(
ServiceEndpoint endpoint,
BindingParameterCollection bindingParameters) {
}
public void ApplyClientBehavior(
ServiceEndpoint endpoint,
ClientRuntime clientRuntime) {
clientRuntime.MessageInspectors.Add(new CookieInspector());
}
public void ApplyDispatchBehavior(
ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher) {
}
public void Validate(ServiceEndpoint endpoint) {
}
}
и я настраиваю и создаю свой канал и клиент WCF в коде:
var ea = new EndpointAddress("http://.../MyService.svc");
// EDIT: Http cookies can't be set with WSHttpBinding :-(
// var binding = WSHttpBinding();
var binding = new BasicHttpBinding();
// Disable automatically managed cookies (which enables user cookies)
binding.AllowCookies = false;
binding.MaxReceivedMessageSize = 5000000;
binding.ReaderQuotas.MaxStringContentLength = 5000000;
var cf = new ChannelFactory<ITranslationServices>(binding, ea);
cf.Endpoint.Behaviors.Add(new CookieBehavior());
ITranslationServices service = cf.CreateChannel();
Однако, когда я смотрю на мой запрос с помощью Fiddler, заголовок http и cookie не заданы, и я понятия не имею, почему. Я читал различные статьи в сети, Stackoverflow и т. Д., Которые в основном говорят, что он должен работать, но это не так. Либо я упускаю что-то очевидное, либо есть ошибка в WCF или что-то еще?