Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF自己的端点行为读取客户端会话_C#_Wcf_Wcf Sessions - Fatal编程技术网

C# WCF自己的端点行为读取客户端会话

C# WCF自己的端点行为读取客户端会话,c#,wcf,wcf-sessions,C#,Wcf,Wcf Sessions,我有一个IClientMessageInspector接口,实现了BeforeSendRequest()方法。 在这个方法中,我想检索客户机中的会话对象集。差不多 public object BeforeSendRequest(ref Message request, IClientChannel channel) { //Instantiate new HeaderObject with values from ClientContext; va

我有一个
IClientMessageInspector
接口,实现了
BeforeSendRequest()
方法。 在这个方法中,我想检索客户机中的
会话
对象集。差不多

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
    {
        //Instantiate new HeaderObject with values from ClientContext;
        var dataToSend = new MyCustomHeader
            {
                MyValue = HowDoIGetClientSession["abcValue"];
            };

        var typedHeader = new MessageHeader<CustomHeader>(dataToSend);
        var untypedHeader = typedHeader.GetUntypedHeader("custom-header", "s");

        request.Headers.Add(untypedHeader);
        return null;
    }
发送请求前的公共对象(参考消息请求,IClientChannel通道)
{
//使用ClientContext中的值实例化新的HeaderObject;
var dataToSend=新的MyCustomHeader
{
MyValue=HowdoGetClientSession[“abcValue”];
};
var typedHeader=新消息头(dataToSend);
var untypedHeader=typedHeader.GetUntypedHeader(“自定义头”,“s”);
request.Headers.Add(非类型头);
返回null;
}

我想我需要与中非常类似的东西。

如果客户端应用程序和WCF服务都托管在同一个应用程序中(实际上是IIS中的虚拟应用程序),则可以共享会话状态

但您需要在WCF中启用ASP.Net compability模式(请参见此:)

如果您的应用程序托管在不同的应用程序中,您仍然可以这样做,但您必须为会话使用外部存储,如会话状态服务器(请参阅此处的更多信息:)

以相同的方式进行,但必须在两个web.config文件中设置相同的会话存储


希望能有帮助

我最终使用了类似于中的方法。 我将相关信息作为键值对添加到cookie中,并在服务实现中读取它。我使用的不是服务参考,而是
ChannelFactory
,但基本上其主要思想与教程中的相同

我的
BeforeSendRequest
方法是:

        public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,
            System.ServiceModel.IClientChannel channel)
        {
            HttpRequestMessageProperty httpRequestMessage;
            object httpRequestMessageObject;
            if (request.Properties.TryGetValue(HttpRequestMessageProperty.Name
                , out httpRequestMessageObject))
            {
                httpRequestMessage = httpRequestMessageObject as HttpRequestMessageProperty;
                if (string.IsNullOrEmpty(httpRequestMessage.Headers["Cookie"]))
                {
                    httpRequestMessage.Headers["Cookie"] = cookie;
                }
            }
            else
            {
                httpRequestMessage = new HttpRequestMessageProperty();
                httpRequestMessage.Headers.Add("Cookie", cookie);
                request.Properties.Add(HttpRequestMessageProperty.Name
                    , httpRequestMessage);
            }

            return null;
        }
绑定设置为:


在我需要的客户端应用程序中(在
web.config
system.serviceModel
中):


在服务实现类注释中:

    [AspNetCompatibilityRequirements(RequirementsMode =
    AspNetCompatibilityRequirementsMode.Required)]
    public class MyService : IMyService {
       // ...
    }
对于服务调用,我使用的是一个包装器对象,它实现了
IDisposable
,在创建通道之前,考虑适当的处理并将
EndpointBehaior
添加到
ChannelFactory

    _factory = new ChannelFactory<T>( );
    _factory.Endpoint.Behaviors.Add(new CookieEndpointBehavior(cookieStr));
    _channel = _factory.CreateChannel();
\u factory=newchannelfactory();
_factory.Endpoint.Behaviors.Add(新的CookieEndpointBehavior(cookieStr));
_通道=_factory.CreateChannel();

我在
using block
中使用服务包装类,一旦它超出范围,它将调用
Dispose

检查它是否在
HttpContext
对象中。你是说在
BeforeSendRequest
方法体中?我没有或者我不知道怎么读
HttpContext。当前的
为空。对于
WCF
我猜它是
OperationContext