使用WCF,.NET 4.5,Visual Studio 2015,并希望使用每会话实例,而不是单例。提供的服务是全双工的,通过tcp.net。
假设我有两台机器,A&乙...
B作为客户端,连接到"服务"作为同一台机器B上的WCF服务提供,并开始与它通话,称之为对象“X”。它还连接到同一服务的另一个实例,称之为对象“Y”
作为一个客户端,想要连接并使用与B交谈的完全相同的对象,对象“X”和“Y”,除非它现在是远程远程,而不是本地远程。
“X”和“Y”实际上是一个视频服务器,都有“状态”。
我可以这样做吗?当我是客户端时,如何指定我想要连接的WHICH服务实例?
显然,在机器" B"上,我可以通过让服务只是前端没有"状态"来解决这个问题,它与#34上运行的某些进程进行通信; B",但这需要我写一堆进程间代码,我讨厌。
预计机器B将运行这些"视频服务器中的100个"实例,每个实例由本地主(单件)服务进行通信,并由最终用户机器进行通信。
我意识到这个问题有点普遍,但它也解决了我在互联网上无法找到或回答的问题。
我只想到了一个可能的,但是kludge-y解决方案:因为主服务是单身,当服务实例" X"由最终用户创建,它可以连接到单件主服务,通过代理到单例。然后,单身人士可以返回与实例" X"通过回调频道。是的,那会有用!凌乱,但可能。
我仍然想知道最终用户A和最终用户B是否可以通过一些时髦的频道操作或其他方式与机器C上的相同(非单一)服务实例通话。据我了解WCF的规则,这根本不可能。如果你自己主持服务而不是IIS,也许可能是,但即便如此,我也不认为它可能吗?
答案 0 :(得分:1)
我遇到了同样的问题并通过创建两个服务引用来解决它,一个用于远程的本地服务引用。我们称之为LocalServiceClient
和RemoteServiceClient
。
在课堂上,创建一个名为Client
的属性(或任何你喜欢称之为的内容):
public LocalServiceClient Client {
get {
return new LocalServiceClient();
}
}
好的,这只适用于其中一个。现在只需创建另一个,并设置与编译器标志一起使用的那个:
#if DEBUG
public LocalServiceClient Client {
get {
return new LocalServiceClient();
}
}
#else
public RemoteServiceClient Client {
get {
return new RemoteServiceClient();
}
}
#endif
使用Client
关键字实例化var
的所有实例,以便隐式输入,或直接使用Client
:
var client = Client;
client.DoSomething...
//or
Client.DoSomething...
这样,当你在本地工作时,它将连接到本地服务,并且在发布配置时(确保你在发布时Release
)它将编译为远程服务。尽管在WCF方面,确保你有两个服务的完全相同的签名/代码。
还有一些方法可以在代码中动态执行,或者像web.config
中那样,它们也可以肯定,但它们通常是一种矫枉过正的方法。您可能需要在调试中连接到本地,在生产中连接到远程,这将为您提供您所需要的。