Хорошо, так что должны произойти две основные вещи:
- Получение файла cookie из контекста веб-приложения в службу WCF
- Получение файла cookie из службы WCF в службу ASMX
ПРИМЕЧАНИЕ: Поскольку вы не указали, я собираюсь предположить , что вы используете клиент WCF в своей службе WCF для связи со службой ASMX. Если это не так, пожалуйста, дайте мне знать, и я соответствующим образом пересмотрю этот пост.
Шаг № 1:
Я бы рекомендовал написать IClientMessageInspector , который вы привязываете к конечным точкам клиента, используя IEndpointBehavior . В вашей реализации IClientMessageInspector :: BeforeSendRequest вы в основном считываете cookie из текущей коллекции HttpContext :: Request :: Cookies и добавляете значение в качестве заголовка сообщения. Это выглядело бы примерно так:
public void BeforeSendRequest(ref Message request, IClientChannel channel)
{
// Get the cookie from ASP.NET
string cookieValue = HttpContext.Current.Request.Cookies["MyCookieName"].Value;
// Create a header that represents the cookie
MessageHeader myCookieNameHeader = MessageHeader.CreateHeader("MyCookieHeaderName", "urn:my-custom-namespace", cookieValue);
// Add the header to the message
request.Headers.Add(myCookieNameHeader);
}
Когда вы настраиваете конечную точку с помощью этого инспектора сообщений, каждый логический запрос автоматически передает значение cookie в качестве заголовка вашей службе WCF. Теперь, поскольку ваш сервис WCF не заботится о самом заголовке, он может игнорировать его. На самом деле, если вы только сделали этот шаг, вы сможете запустить весь свой код прямо сейчас и не испытывать никакой разницы.
Шаг № 2:
Теперь нам нужен файл cookie для перехода из службы WCF в службу ASMX. Еще раз, все, что вам нужно сделать, это реализовать IClientMessageInspector , за исключением того, что ваш BeforeSendMessageRequest будет немного другим:
public void BeforeSendRequest(ref Message request, IClientChannel channel)
{
// Get the cookie value from the custom header we sent in from step #1
string cookieValue = OperationContext.Current.IncomingMessageHeaders.GetHeader<string>("MyCookieHeaderName", "urn:my-custom-namespace");
HttpRequestMessageHeaderProeperty httpRequestMessageHeaderProperty;
MessageProperties outgoingMessageProperties = OperationContext.Current.OutgoingMessageProperties;
// Get the HttpRequestMessageHeaderProperty, if it doesn't already exist we create it now
if(!outgoingMessageProperties.TryGetValue(HttpRequestMessageHeaderProperty.Name, out httpRequestMessageHeaderProperty))
{
httpRequestmessageHeaderProperty = new HttpRequestMessageHeaderProperty();
outgoingMessageProperties.Add(HttpRequestMessageHeaderProperty.Name, httpRequestmessageHeaderProperty);
}
// Set the cookie header to our cookie value (note: sample assumes no other cookies set)
httpRequestmessageHeaderProperty.Headers[HttpRequestHeader.Cookie] = cookieValue;
}
Еще раз вам нужно привязать это к конечной точке для вашей службы ASMX, используя IEndpointBehavior , и каждый ваш логический запрос автоматически пропустит cookie через.