2

我有一个通过 WCF 客户端与 WCF 服务通信的 Web 应用程序。在调用我的代码时,已发出身份验证 cookie,并且我依赖于需要这些身份验证 cookie 的 ASMX 服务。

我需要将 cookie 从 Web 应用程序通过 WCF 客户端传递到 WCF 服务再到 ASMX 服务。

有任何想法吗?看起来我最好的选择可能是将 allowCookies 设置为 false,解析 cookie 标头,尝试在 WCF 服务上重新创建它们,然后将它们附加到 SOAP 请求。

注意:我查看了这篇文章,看起来很接近但不太适用于这个问题。在链接场景中,ASMX 服务正在创建 cookie,必须由同一个 WCF 客户端将其持久化到后续的 ASMX 服务。

4

1 回答 1

8

好的,所以有两个主要的事情需要发生:

  1. 将 cookie 从 Web 应用上下文获取到 WCF 服务
  2. 从 WCF 服务获取 cookie 到 ASMX 服务

注意:由于您没有指定,我将假设您在 WCF 服务中使用 WCF 客户端与 ASMX 服务通信。如果不是这种情况,请告诉我,我会相应地修改这篇文章。

步骤1:

我建议编写一个IClientMessageInspector,您使用 IEndpointBehavior 绑定到您的客户端端点。在你的实施IClientMessageInspector::BeforeSendRequest的实现中,您基本上是从当前的 HttpContext::Request::Cookies 集合中读取 cookie 并将该值附加为消息头。看起来有点像这样:

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;
}

再次,您需要使用 IEndpointBehavior 将其绑定到您的 ASMX 服务的端点,并且您发出的每个逻辑请求都将自动传递 cookie。

于 2009-10-21T23:56:16.897 回答