【问题标题】:How to simultaneously implement Session and Transaction Flow in WCF?如何在 WCF 中同时实现 Session 和 Transaction Flow?
【发布时间】:2014-12-25 18:29:35
【问题描述】:

在尝试回答 question 时,很明显我自己或 OP 都无法同时构建启用 SessionTransactionFlow 的 WCF 服务 - 我能提供的唯一解决方案是删除 @ 987654324@ 以使 WCF 会话实例正常工作。

虽然从逻辑上讲会话持续时间可能比事务长(请记住,TransactionFlow 可能意味着事务占用了宝贵的服务器资源,如数据库锁、消息队列和事务文件系统),但无论哪种方式,我都找不到明确的参考确认或拒绝同时实现这两个功能的可能性。

所以我的问题是:如何让 InstanceContextMode=InstanceContextMode.PerSessionTransactionFlow 在 WCF 中同时工作?

尝试了什么:

ITransactionService.cs

[ServiceContract(SessionMode = SessionMode.Required)]
public interface ITransactionService
{
    [OperationContract(IsInitiating = true, IsTerminating = false)]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    int Start(int userId);

    [OperationContract(IsInitiating = false, IsTerminating = true)]
    [TransactionFlow(TransactionFlowOption.Mandatory)]
    int Finish(int userId);
}

TransactionService.svc.cs

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]
public class TransactionService : ITransactionService
{
    public int count = 0;

    [OperationBehavior(TransactionScopeRequired = true)]
    public int Start(int userId)
    {
        Debug.Assert(Transaction.Current != null, "No Transaction!");
        count = count + 1;
        return count;
    }

    [OperationBehavior(TransactionScopeRequired = true)]
    public int Finish(int userId)
    {
        Debug.Assert(Transaction.Current != null, "No Transaction!");
        Debug.Assert(count > 0, "No Session!");
        return count;
    }

Client.cs

  using (var ts = new TransactionScope())
  using (var svc = new TransactionServiceClient())
  {
      svc.Start(0);
      svc.Finish(0);
      ts.Complete();
  }

服务 web.config

  <services>
      <service name="WcfLibrary1.TransactionService">
          <endpoint address="" binding="wsHttpBinding"
          contract="WcfLibrary1.ITransactionService">
              <identity>
                  <dns value="localhost" />
              </identity>
          </endpoint>
      </service>
  </services>
   <bindings>
       <wsHttpBinding>
           <binding transactionFlow="true"/>
       </wsHttpBinding>
   </bindings>
   <protocolMapping>
       <remove scheme="http" />
       <add scheme="http" binding="wsHttpBinding" bindingConfiguration="transactionFlowEnabled"/>
   </protocolMapping>

客户端 web.config

<bindings>
    <wsHttpBinding>
        <binding name="WSHttpBinding_ITransactionService" transactionFlow="true" />
    </wsHttpBinding>
</bindings>
<client>
    <endpoint address="http://localhost:65171/TransactionService.svc"
        binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ITransactionService"
        contract="TransactionService.ITransactionService" name="WSHttpBinding_ITransactionService">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
</client>

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    经过反复试验,看来这是可能的。问题似乎是TransactionFlow applies the following default settings 的默认行为:

    当相互结合使用时,会导致服务实例被释放,从而破坏现有Session中保留的任何状态。

    禁用这些选项中的任何一个都将使服务实例在会话期间保持活动状态,从而允许同时使用 TransactionFlowSession

    即在ServiceContract:

    [ServiceContract(SessionMode = SessionMode.Required)]
    public interface ITransactionService
    {
        [OperationContract(IsInitiating = true, IsTerminating = false)]
        [TransactionFlow(TransactionFlowOption.Mandatory)]
        int Start(int userId);
    
        [OperationContract(IsInitiating = false, IsTerminating = true)]
        [TransactionFlow(TransactionFlowOption.Mandatory)]
        int Finish(int userId);
    }
    

    在 Service 类上对此进行更改:

    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession,
                     ReleaseServiceInstanceOnTransactionComplete = false)]
    public class TransactionService : ITransactionService
    {
    

    或者,关于操作:

        [OperationBehavior(TransactionScopeRequired = true, 
                           TransactionAutoComplete = false)]
        public int Start(int userId)
        {
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      相关资源
      最近更新 更多