【问题标题】:Keep transaction between web service calls保持 Web 服务调用之间的事务
【发布时间】:2016-02-09 10:04:29
【问题描述】:

我在 ASP.NET 4.5.1 中有一个 Web 服务 (Service.svc.cs)。

我有一种方法叫做 "public string UploadData(Guid id, string[] data)"

客户端使用字符串调用此方法,服务器将数据存储在 SQL-Server 数据库中,但不提交或回滚此 DbTransaction。

然后,同一个客户端应该(例如 5 秒后)调用其他两种方法之一: “提交数据(Guid id)”或 "RollbackData(Guid id)"

根据方法,服务器应该提交或回滚事务。如果客户端在 30 秒内没有调用,事务应该回滚。

我曾尝试在调用之间将事务存储在服务器的内存中,但事务已损坏。事务中的某些值,例如连接被重置为空。所以提交或回滚不起作用。

在 Web 服务调用之间保留 System.Data.Common.DbTransaction 的最佳方法是什么?

【问题讨论】:

  • 您有很多客户,还是只有一个?

标签: c# asp.net web-services transactions


【解决方案1】:

一种方法是,

  1. [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] 属性设置为服务类
  2. 创建类TransactionData { DbTransaction, StartDate }
  3. 创建一个static 字典,IDictionary<GUID, TransactionData> transactions;
  4. 当用户调用第一种方法时,使用一些新创建的 guid 将事务存储到此字典中,并将 guid 返回给用户
  5. 在其他调用中,用户将此 guid 发送到服务器,检查事务是否存在提交或回滚
  6. 创建一个单独的线程,或在每次用户调用时,检查并回滚/清除旧事务的字典...

您可以尝试使用 Session,而不是 Dictionary...无论如何,如果您在 IIS 下托管,除了外部存储之外几乎没有办法保留持久数据...但这适用于您的情况

【讨论】:

  • 感谢您的帮助。似乎线程不打算与 Web 服务一起使用。但多亏了你的帮助,我才开始工作!
猜你喜欢
  • 1970-01-01
  • 2010-11-27
  • 2019-08-18
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2011-07-21
  • 2013-05-14
  • 1970-01-01
相关资源
最近更新 更多