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
。