WCF添加自定义标头和会话

时间:2011-08-31 13:50:52

标签: asp.net wcf session

我有一个使用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?

2 个答案:

答案 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页面共享数据的唯一方法。

相关问题