我在wshttpbinding中使用了InstanceContextMode.PerSession,如下面的代码所示,但似乎没有用,因为我的计数没有增加。
请建议。
[ServiceContract(SessionMode = SessionMode.Required)]
public interface ITransService
{
[OperationContract(IsInitiating=true)]
int Insert(int userId);
[TransactionFlow(TransactionFlowOption.Allowed)]
[OperationContract]
int Update();
// TODO: Add your service operations here
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class TransService : ITransService
{
public int count = 0;
[OperationBehavior(TransactionScopeRequired = true)]
public int Insert(int userId)
{
count = count+1;
return count;
}
[OperationBehavior(TransactionScopeRequired = true)]
public int Update()
{
count = count++;
return count;
}
}
客户电话---
using (TransactionScope tranScope = new TransactionScope())
{
TransServiceClient obj = new TransServiceClient();
var a= obj.Insert(123);
var b = obj.Insert(123);
var c = obj.Update();
tranScope.Complete();
}
答案 0 :(得分:0)
除了将界面标记为 (SessionMode = SessionMode.Allowed)
之外,您还需要在界面initiate上定义哪些方法,如下所示:例如:如果Just Insert启动会话:[OperationContract(IsInitiating = true)] int Insert(int userId);有一个example here
(不,IsInitiating = true
是任何事件的默认设置)
根据扩展评论,试错法最终导致TransactionFlow
阻止SessionMode
正常工作。我目前无法找到明确的参考资料 - 最接近日期is this。从逻辑上讲,会话可以持续比事务更长的持续时间(并且假设事务可以保存数据库和队列资源上的锁),则存在一些逻辑。
解决方案是删除TransactionFlow
。
修改
对于那些希望合并InstanceContextMode = InstanceContextMode.PerSession
和TransactionFlow
,see here