我有一个使用WCF服务的网页。多个用户可能同时使用该网页,因此向远程计算机上的WCF服务发出请求。
网页上的每个用户都会获得一个唯一ID,我想将此唯一ID添加到该用户发出的每个请求的请求标头中。
到目前为止,我已经创建了以下代码,可以正确地为WCF消息添加标头。
public class HeaderIdPusher : IClientMessageInspector
{
private static readonly string _balancerKey = "balancerId";
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
Guid userId = Guid.NewGuid();
HttpRequestMessageProperty httpRequestMessage;
object httpRequestMessageObject;
if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name, out httpRequestMessageObject))
{
httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
if (string.IsNullOrEmpty(httpRequestMessage.Headers[_balancerKey]))
{
httpRequestMessage.Headers[_balancerKey] = userId.ToString();
}
}
else
{
httpRequestMessage = new HttpRequestMessageProperty();
httpRequestMessage.Headers.Add(_balancerKey, userId.ToString());
request.Properties.Add(HttpRequestMessageProperty.Name, httpRequestMessage);
}
return null;
}
public void AfterReceiveReply(ref Message reply, object correlationState)
{
}
}
但是我没有被卡住,因为我无法在请求之间保持ID。你可以在这里看到,我正在为每个请求生成一个ID,但是由于HttpContext.Current为null,我无法将其存储在用户所在页面的Session中。还有另一种存储方式吗?是否有另一种方法在我的网页上传递用户的HttpContext?
答案 0 :(得分:0)
这里讨论的问题是: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/27896125-b61e-42bd-a1b0-e6da5c23e6fc
基本上WCF没有会话,因为你可以传递你想要的任何参数(在这种情况下,你的唯一ID)并在你的实现中以任何你想要的方式处理它。
答案 1 :(得分:0)
经过多次黑客攻击后,我找到了一个解决方案,它不是很好但是有效。
在创建WCF服务实例之前的ASP.NET页面中,我创建了一个地址头和端点:
AddressHeader header = AddressHeader.CreateAddressHeader("MyKey", "http://www.w3.org/2005/08/addressing", "MyValue");
EndpointAddress endpoint = new EndpointAddress(new Uri("http://www.myservice.com/service"), header);
然后我创建一个在端点中传递的服务实例:
using (WcfService service = new WcfService(_configName,endpoint ))
{
}
这将数据导入WCF服务,然后在HeaderIdPusher:IClientMessageInspector上面详细说明我将标题值拉出来:
public class HeaderIdPusher : IClientMessageInspector
{
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
string id = "Not found";
if(channel.RemoteAddress.Headers.Any(x=>x.Name == "MyKey"))
{
id = channel.RemoteAddress.Headers.First(x => x.Name == "MyKey").GetValue<string>();
}
这个解决方案并不理想,它会将额外的数据放入SOAP消息中,但这是我发现使用WCF进程从ASP.NET页面共享数据的唯一方法。