WCF -> ASMX и Cookies - PullRequest
       17

WCF -> ASMX и Cookies

2 голосов
/ 12 октября 2009

У меня есть веб-приложение, которое связывается со службой WCF через клиента WCF. В тот момент, когда мой код вызывается, куки аутентификации были выпущены, и у меня есть зависимость от службы ASMX, которая ожидает эти куки аутентификации.

Мне нужно передать файлы cookie из веб-приложения через клиент WCF в службу WCF в службу ASMX.

Есть идеи? Похоже, что моя лучшая ставка может заключаться в том, чтобы установить для allowCookies значение false, проанализировать заголовки файлов cookie, попытаться воссоздать их в службе WCF и затем присоединить их к запросу SOAP.

Примечание: я посмотрел эту статью , которая кажется близкой, но не совсем применимой к этому вопросу. В связанном сценарии служба ASMX создает файлы cookie, которые должны быть сохранены в последующей службе ASMX тем же клиентом WCF.

1 Ответ

8 голосов
/ 22 октября 2009

Хорошо, так что должны произойти две основные вещи:

  1. Получение файла cookie из контекста веб-приложения в службу WCF
  2. Получение файла 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 через.

...