C# WCF实际上是如何工作的?

C# WCF实际上是如何工作的?,c#,wcf,C#,Wcf,我已经创建了一个C#应用程序,我想将其分为服务器端和客户端。客户端应该只有一个UI,服务器端应该管理逻辑和数据库 但是,有一点我不确定:我的应用程序应该同时被多个用户使用。如果我将应用程序移动到服务器上,WCF会为每个登录的用户创建另一个应用程序实例,还是所有用户只有一个应用程序实例 如果第二个场景是真的,那么如何为希望使用我的服务的每个用户创建单独的应用程序实例?我希望将我的应用程序逻辑保留在服务器上,让用户共享同一个数据库,同时也让每个实例独立(这样多个用户可以使用不同数据的WCF服务)。像

我已经创建了一个C#应用程序,我想将其分为服务器端和客户端。客户端应该只有一个UI,服务器端应该管理逻辑和数据库

但是,有一点我不确定:我的应用程序应该同时被多个用户使用。如果我将应用程序移动到服务器上,WCF会为每个登录的用户创建另一个应用程序实例,还是所有用户只有一个应用程序实例

如果第二个场景是真的,那么如何为希望使用我的服务的每个用户创建单独的应用程序实例?我希望将我的应用程序逻辑保留在服务器上,让用户共享同一个数据库,同时也让每个实例独立(这样多个用户可以使用不同数据的WCF服务)。像PHP这样的东西:相同的代码,每个用户的新代码实例,共享数据库。

服务器端(由WCF处理)通常根本不会持有任何状态:所有方法调用都是自包含的,相当原子化的。例如,
GetUsers
AddOrder
等。因此没有应用程序的“实例”,事实上WCF服务不知道它是使用它的特定应用程序

这是有目的的:如果你想编写一个web应用程序或简单的查询工具,它可以在WCF服务上使用相同的方法,而不必成为“应用程序”,或者在服务器上创建任何东西的实例

WCF可以拥有具有较长生命周期的对象,这些对象是有状态的,有点像远程处理,但是如果您使用WCF遵循99.9%的其他设计模式,那么您将使用WCF作为web服务

编辑:从您的评论中,您需要认真地、潜在地深入阅读客户机-服务器体系结构和WCF的使用。从零开始使用一些小的方法,然后尝试将其应用于当前的应用程序。

服务器端(由WCF处理)通常根本不会保持任何状态:所有方法调用都是自包含的,并且相当原子化。例如,
GetUsers
AddOrder
等。因此没有应用程序的“实例”,事实上WCF服务不知道它是使用它的特定应用程序

这是有目的的:如果你想编写一个web应用程序或简单的查询工具,它可以在WCF服务上使用相同的方法,而不必成为“应用程序”,或者在服务器上创建任何东西的实例

WCF可以拥有具有较长生命周期的对象,这些对象是有状态的,有点像远程处理,但是如果您使用WCF遵循99.9%的其他设计模式,那么您将使用WCF作为web服务


编辑:从您的评论中,您需要认真地、潜在地深入阅读客户机-服务器体系结构和WCF的使用。从零开始,使用一些小的东西,然后尝试将其应用到当前的应用程序。

默认情况下,WCF是无状态且无瞬时的。这基本上意味着任何呼叫都可以由任何客户机发出,而没有任何客户机或呼叫相互了解


只要您在设计服务时牢记这一点,您就可以继续。考虑到目前您的服务是如何构建的,您预计会出现什么问题?

默认情况下,WCF是无状态且无实例的。这基本上意味着任何呼叫都可以由任何客户机发出,而没有任何客户机或呼叫相互了解


只要您在设计服务时牢记这一点,您就可以继续。考虑到目前您的服务是如何构建的,您预计会出现什么问题?

嗯,我创建的应用程序没有任何拆分计划,因此我的应用程序正在交换对象。实际上,这是一个游戏(只是没有图形)。所以,我需要所有用户都有共享的数据库,但他们在客户端UI上看到的数据不同。考虑到这一点,我认为服务器必须对每个用户在其列表中的所有内容都有一些了解,例如(第四个用户的lstItems中的第三个元素是什么?)。不,您必须创建一个
void addItemList(int userId,Item Item)
调用来存储用户拾取的项目,以及一个
List GetItems(int userId)
调用以从另一个用户处获取对象列表。但是,如果我在WCF端创建一个列表对象(并存储传递给“AddItemToList”方法的项),该列表是否会由在该特定时刻使用该服务的所有用户的数据填充?不,这就是userId参数的用途。您需要知道给定的请求是谁的,许多方法之一是向所有服务方法添加一个标识用户的参数。然后使用该ID在数据库中存储/检索每个用户的项目。您必须这样做,因为WCF进程不“活动”,并且它不知道连接的其他用户。它们实际上是通过数据库中的数据进行通信的。服务器端的持久性和状态应该通过一些实际持久性的东西来处理,比如数据库或文件。你可以在内存中缓存东西,但你不应该真正依赖它。依靠可靠的东西,比如数据库。顺便说一句,这适用于WCF作为web服务。如果你正在做一个游戏,你可能想考虑一个不同的技术,但是在技术上很难用相当大的余量来实现。嗯,我已经创建了我的应用程序,没有任何分割它的计划,所以我的应用程序正在交换对象。实际上,这是一个游戏(只是没有图形)。所以,我需要所有用户都有共享的数据库,但他们在客户端UI上看到的数据不同。考虑到这一点,我认为服务器必须对每个用户在其列表中的所有内容都有一些了解,例如(第四个用户的lstItems中的第三个元素是什么?)。不,您必须创建一个
void addItemList(int userId,Item Item)
调用来存储用户拾取的项目,以及一个
List GetItems(int userId)
调用以从其他用户获取对象列表。但是,如果我在WCF端创建一个列表对象(并存储传递给“AddItemToList”方法的项),