在WCF中管理状态的最可扩展方式是什么。
我只需要一个变量来指示会话,我将在MSSQL中管理与会话相关的信息。我不需要知道会话何时结束。每天一次,我将清除任何旧会议。
看来SessionID就是那个变量。
对于比例我使用Per Call,因为ctor是空的。我认为每次会议都不需要。
在我简单的EightBall测试中,我得到一个表示会话的SessionID。但我只是在一个盒子上进行测试。
让我担心的是,我看到一些文档需要设置ReliableSessionBindingElement On,默认情况下它是Off。
在以下配置中,SessionID是否是会话的可靠指标?
<system.serviceModel>
<services>
<service name="MajicEightBallServiceLib.MagicEightBallService"
behaviorConfiguration="EightBallServiceMEXBehavior" >
<endpoint address=""
binding="wsHttpBinding"
contract="MajicEightBallServiceLib.IEightBall" />
<endpoint address="mex"
binding ="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000/MagicEightBallService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="EightBallServiceMEXBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
[ServiceBehavior (InstanceContextMode=InstanceContextMode.PerCall)]
public class MagicEightBallService : IEightBall
{
public MagicEightBallService()
{
Console.WriteLine("Eightball awaits your question ...");
}
public string ObtainAnswerToQuestion(string userQuestion)
{
return "maybe " + OperationContext.Current.SessionId.ToString();
}
public sDoc GetSdoc(int sID)
{
List<sDocProp> props = new List<sDocProp>();
sDocProp prop1 = new sDocProp { ID = 1, Name = "Prop1", ArrivalStatus = ArrivalStatus.OnTime };
props.Add(prop1);
sDocPropStringSV prop2 = new sDocPropStringSV { ID = 1, Name = "Prop1", ArrivalStatus = ArrivalStatus.OnTime, Value = "StrValue1" };
props.Add(prop2);
sDoc sDoc = new sDoc { sID = sID, sParID = 1, Props = props, SessionID = OperationContext.Current.SessionId.ToString() };
return sDoc;
}
答案 0 :(得分:2)
WCF支持4种类型的会话,可靠会话只是其中之一。因此,您无需将ReliableSessionBindingElement设置为On以启用会话。您可以使用其他会话类型。
System.ServiceModel.Channels.ReliableSessionBindingElement
, 它实现了WS-ReliableMessaging规范 支持可靠的会话,其中按顺序传递消息 并且恰好一次,即使消息传播也能提供信心 会话期间有多个节点。
实际上wsHttpBinding
默认使用安全会话来加密和数字签名消息。
SessionID是否是会议中可靠的会话指标 以下配置?
服务可以检查您的绑定是否配置为使用ServiceContractAttribute.SessionMode
属性使用会话。
以下服务合同要求已配置的绑定使用会话。
[ServiceContract(SessionMode = SessionMode.Required)]
public interface IEightBall
如果您的代码不依赖于除会话ID之外的任何会话数据,则在WCF中管理状态的最可扩展方式是什么。
InstanceContextMode.PerCall
是正确的选择。会话ID是WCF消息的一部分,因此不需要比处理请求所需的时间长InstanceContext
。
另一个问题:
SessionID是否是会议中可靠的会话指标 以下配置?
答案是肯定的。
以下是属性System.ServiceModel.OperationContext.SessionId
的反向工程代码。正如您所看到的,SessionId
已从Channel.Session
加载而非空SessionId
仅在Session
不为空时返回值。
public string SessionId
{
get
{
if (this.channel != null)
{
IChannel innerChannel = this.channel.InnerChannel;
if (innerChannel != null)
{
ISessionChannel<IDuplexSession> sessionChannel = innerChannel as ISessionChannel<IDuplexSession>;
if (sessionChannel != null && sessionChannel.Session != null)
{
return sessionChannel.Session.Id;
}
ISessionChannel<IInputSession> sessionChannel2 = innerChannel as ISessionChannel<IInputSession>;
if (sessionChannel2 != null && sessionChannel2.Session != null)
{
return sessionChannel2.Session.Id;
}
ISessionChannel<IOutputSession> sessionChannel3 = innerChannel as ISessionChannel<IOutputSession>;
if (sessionChannel3 != null && sessionChannel3.Session != null)
{
return sessionChannel3.Session.Id;
}
}
}
return null;
}
}