好的,所以有两个主要的事情需要发生:
- 将 cookie 从 Web 应用上下文获取到 WCF 服务
- 从 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。