【问题标题】:WCF Adding Custom Headers and SessionWCF 添加自定义标头和会话
【发布时间】:2011-09-01 17:12:36
【问题描述】:

我有一个使用 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,但是我无法将其存储在用户所在页面的 Session 中,因为 HttpContext.Current 为空。还有另一种存储方式吗?有没有其他方法可以在我的网页上传入用户的 HttpContext?

【问题讨论】:

    标签: asp.net wcf session


    【解决方案1】:

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

    WCF 基本上没有会话,因为您可以将任何您想要的作为参数(在本例中为您的唯一 ID)传递并在您的实现中以您想要的任何方式处理它。

    【讨论】:

    • 是否可以将数据从 ASP.NET 页面传递到 IClientMessageInspector?
    • 您能否提供更多信息,您是如何调用 WCF 服务的。是直接来自客户端还是通过asp.net服务器?
    【解决方案2】:

    经过多次黑客攻击,我找到了一个解决方案,虽然不是很好,但它确实有效。

    在创建 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 页面的数据的唯一方法。

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多