WCF "global coordinator"

WCF "global coordinator"

我正在使用 WCF 在 C# 中实现 Web 服务。目标是创建服务,使用户能够在 "transaction" 内从服务器写入或读取文件。 写作示例场景:

  1. 用户打开交易(向服务器发送打开请求)
  2. 用户发送带有文件名和内容的请求以写入文件
  3. ...其他 read/write 操作...
  4. 用户结束事务并在服务器中进行(提交)更改。

因为它是已经存在的小型分布式系统的一部分,所以我必须使用 JSON 并通过 HTTP 发送它,而且它无法更改。

交易是根据客户端生成的ID(UUID)来区分的。事务有限制的最大空闲时间。当事务打开时,它一直存在,直到达到超时或客户端完成事务。事务中的每个新操作都应重置超时计数器。 每次客户端要写入文件时,文件在事务存在时被阻塞。如果文件已被其他事务阻止,请求将等待一段时间以打开文件。如果打开则操作继续,否则整个事务回滚。

我正在使用以下配置:

我的IService.cs:

namespace WcfJsonRestService
{
    [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
                   RequestFormat = WebMessageFormat.Json,
                   ResponseFormat = WebMessageFormat.Json,
                   BodyStyle = WebMessageBodyStyle.Bare,
                   UriTemplate = "/data")]
        Response handleRequest(TransactionRequest tRequest);
    }

    [DataContract]
    public class TransactionRequest
    {
        [DataMember]
        public string action { get; set; }
        [DataMember]
        public RequestData data { get; set; }
    }

    [DataContract]
    public class RequestData
    {
        [DataMember]
        public string client_name { get; set; }
        [DataMember]
        public string transactionId { get; set; }
        [DataMember]
        public string file { get; set; }
        [DataMember]
        public string content { get; set; }
    }
}

我想要像 "global coordinator" / 主线程 / 处理程序这样的东西一直工作,以便管理打开的事务和阻止的文件。我需要在我的服务中使用以下功能:

我不知道如何实现这种在后台工作的协调器thread/service。它将解决在服务 class 中管理多个线程的问题。我考虑过另一种存储有关事务、阻止文件及其超时的信息的服务,具有获取或重置它们的功能,但它会使通信加倍并降低我服务的可靠性。

问题:如何引入后台thread/service管理我的服务状态,如阻止的文件或打开的交易?

您似乎将 "coordinator" 视为在后台运行并管理一切的代理。该代理可以按照您的建议作为线程实现。请求将进入该代理,得到服务并回复。

没有必要有这样的agent/thread。您可以在收到请求时对 WCF 线程执行所有必要的处理。当然,您需要同步对所有共享可变数据结构的访问。

如果您只使用全局锁,这将等同于您提出的基于代理的解决方案,但更简单。

如果您需要基于时间的触发(可能过期),请使用计时器。