2011-08-31 28 views
0

我有一个使用WCF服务的网页。多个用户可能一次使用该网页,因此向远程机器上的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为空,因此无法将其存储在用户所在页面的Session中。还有另一种存储方式吗?在我的网页上有另一种传递用户的HttpContext的方法吗?

回答

0

经过多次黑客攻击后,我找到了一个解决方案,它不是很好,但它的工作原理。

在ASP.NET页面之前,我创建WCF服务实例创建一个地址头和端点:

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

0

的问题是在这里讨论: http://social.msdn.microsoft.com/forums/en-US/wcf/thread/27896125-b61e-42bd-a1b0-e6da5c23e6fc

本质WCF没有会话,因为你可以通过任何你想作为一个参数(在这种情况下,您的唯一ID),并处理它你想要的任何方式在你的实现中。

+0

有没有办法将数据从ASP.NET页面传递到IClientMessageInspector? –

+0

你能提供更多的信息你如何调用WCF服务。它是直接从客户端还是通过asp.net服务器? – Kaido

相关问题