C# WCF是我的正确选择吗?

C# WCF是我的正确选择吗?,c#,.net,mysql,wcf,C#,.net,Mysql,Wcf,从我对WCF所知的一点来看,它似乎是解决我遇到的一个特定问题的正确方法,但我想从中得到一些信息 问题描述: 客户端从一个列表中顺序访问域对象,大约每1-10分钟访问一次(平均为2分钟),但任何两个客户端都不应该访问同一个对象。应在列表中维护某些订单 用法示例: Client X -> WCFService::GetNextObject() -> Fetch from DB, sort <- return nextObject Where X is [1,~2

从我对WCF所知的一点来看,它似乎是解决我遇到的一个特定问题的正确方法,但我想从中得到一些信息

问题描述:

客户端从一个列表中顺序访问域对象,大约每1-10分钟访问一次(平均为2分钟),但任何两个客户端都不应该访问同一个对象。应在列表中维护某些订单

用法示例:

Client X -> WCFService::GetNextObject() -> Fetch from DB, sort
         <- return nextObject

Where X is [1,~200)
Client X->WCFService::GetNextObject()->从数据库获取,排序

在我看来,您只是在多个客户端的队列中从服务获取数据

如果是这种情况,您应该只使用SQL Server,这实际上是数据库中的一个队列表。每次客户机从表中取出一个项目时,它都会更新其他工件的优先级

或者更好的方法是,只需使用标识主键并始终获取最低id,在获取时将其删除,或者出于某种原因将其移动到另一个表中


如果您想免费使用SQL Server或SQL Server Express,您可以免费获得所有锁定等功能。

WCF非常适合向您的客户端隐藏服务器的详细信息,它提供了一个抽象层,可以非常方便地处理大量客户端。如果这是一对夫妇从数据库中请求数据,那么我会说WCF会有点过头,但听起来这是这项技术的正确应用

关于WCF服务的状态,这是可配置的。您可以让服务作为单例运行,也可以让它在每次会话甚至每次调用中生成一个新实例


下面是对WCF实例的(详细的!)解释:

我同意Jake的观点,但我想补充几点:

  • 客户机可能会失败或消失,因此重要的是不要仅仅将对象交给他们,然后失去对它的所有控制。通常的方法是将is租借给他们一段时间,这样,如果他们没有完成处理,那么对象将直接返回队列。在你的情况下,我怀疑它会回到队列的前面,但通常是最后。您还希望在某些对象有毒且无法处理时跟踪重试

  • 除非您的所有客户机都是.NET,否则您将希望坚持使用WCF中更通用的部分


  • 似乎涉及WCF和MSMQ的解决方案可能适合您的需求。您可以使用MSMQ存储下一个需要向客户端提供服务的项目,而您的WCF服务可以是MSMQ的前端,这样您的客户端就不必直接与它交互。由于您的状态在MSMQ中维护,您的WCF服务可能会保持无状态。

    这不是一个好建议。OP表示,用户分布在不同的地理位置。向Internet开放SQL端口不是一个好做法。--在这里插入关于将Jimmy Hoffa的答案埋在这里的笑话——我假设它将是一个内部网,我工作过的大多数地方都有分布在全球各地的开发办公室,人们不会再三考虑是否有一个中央数据库供我们传递的客户端使用。如果他指的是一个公开发布的客户是的,这将是一个可怕的方式,对不起,我没有规定。他们可以使用MSMQ,但几乎不需要。数据库完全能够支持优先级队列;虽然询问者确实提到了数据库中的队列实现,但我还是让读者(无论是询问者还是其他人)来决定MSMQ是否是他们希望包含在解决方案中的技术。如果队列逻辑已经在数据库中实现,那么在图片中引入MSMQ可能没有多大意义。Wiley的徒弟:我不熟悉MSMQ(稍后将对其进行研究),但我可以说,队列逻辑是作为两阶段过程实现的。第一阶段是分配存储在数据库中的优先级,但是优先级不是唯一的因素。根据第二阶段通行证,优先级为1的物体在5年内可能不合格,这需要实时信息。当我收到代码库时,唯一完成的排队是第二阶段(在整个数据集/表上)。第一阶段(优先级设置/检查)的实施是为了减少数据库抖动。老实说,MSMQ不是我经常使用的技术,因此您可能想对我的建议持保留态度。这是一种排队技术,这就是为什么它可能适合您的需要。但是,它不是用于长期存储的,因此,如果您要将项目存放5年,那么您可能希望保留数据库以供存储。W:我使用了MSMQ。一般来说,我不会很快推荐它。根据上面的评论,它似乎也不符合具体情况。你说的“更通用的部件”是什么意思?WCF标准不符合SOAP吗?@SiN:是的,我是说SOAP。WCF可以做SOAP,但它也不支持HTTP通道,并且提供了许多其他选项,据我所知,这些选项不是SOAP的一部分。