WCF服务是否可以返回其他服务?
代码:
[ServiceContract]
public interface IServiceA
{
[OperationContract]
IServiceB GetServiceB();
[ServiceContract]
public interface IServiceB
{
public class ServiceA : IServiceA
{
public IServiceB GetServiceB()
{
return new ServiceB();
}
正在激活调用ServiceB的ServiceA的表单:
public partial class Form1 : Form
{
private void button1_Click(object sender, EventArgs e)
{
ServiceReference1.ServiceAClient client = new
ServiceReference1.ServiceAClient();
IServiceB serviceB = client.GetServiceB();
当然这是不可能的,因为GetServiceB()返回对象而不是像这样投射时的服务:
IServiceB serviceB = (ServiceB) client.GetServiceB();
我收到CommunicationException:“现有连接被远程主机强行关闭”
答案 0 :(得分:2)
不,你不能这样做 - 你的客户端需要ServiceB端点的配置数据。
另一种解决方法是让ServiceA调用ServiceB,这样客户端只需要与ServiceA进行交互。
答案 1 :(得分:1)
是的,你不能。
传递远程引用的这种简单性也是其中之一 .NET Remoting中最大的危险。在很多架构中, 除了一些非常需要远程参考的传输 有限和受控案件。传递MarshalByRefObject而不是 一个[Serializable]对象 - 错误 - 通常导致显着 性能和可扩展性恶化。毕竟:每个方法调用都会 现在必须通过网络旅行,可能跨越多个 城市,国家或大陆。
...
在WCF中,您可以传递对远程服务的引用,但您必须这样做 非常明确地这样做。它通常不能没有 非常明确的意图。
因此 能力(shareable services)来共享服务实例客户端。 Shareable在WCF的Beta1或Beta2中,但在产品的最终版本发布之前被删除。但文章说:
您可以重新使用基于.NET Remoting的IRemoteFactory接口和 注释它与WCF兼容
保留引用(clent object graphs)part也很有趣。
今天,您可以在客户端(“共享实例”)与InstanceContextMode.Single(以及自定义客户端 - 服务 - 客户端会话逻辑)或IInstanceContextProvider
之间进行交互