InstanceContextMode.PerSession不起作用

时间:2014-12-24 18:12:23

标签: asp.net wcf c#-4.0 wcf-binding

我在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();
                }

1 个答案:

答案 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.PerSessionTransactionFlowsee here

的人