1

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:“现有连接被远程主机强行关闭”

4

2 回答 2

2

不,您不能这样做 - 您的客户端将需要 ServiceB 端点的配置数据。

解决此问题的另一种方法是让 ServiceA 调用 ServiceB,这样您的客户端将只需要与 ServiceA 交互。

于 2013-02-28T23:16:40.970 回答
1

是的,你不能。

这种传递远程引用的简单性也是 .NET Remoting 中最大的危险之一。在许多架构中,除了一些非常有限和受控的情况外,不希望传输远程引用。错误地传递 MarshalByRefObject 而不是 [Serializable] 对象通常会导致性能和可伸缩性显着恶化。毕竟:每个方法调用现在都必须通过网络传输,可能跨越多个城市、国家或大陆。

...

在 WCF 中,您可以传递对远程服务的引用,但您必须非常明确地这样做。它通常不可能在没有非常明确的意图的情况下发生。

通过英戈

因此,有一种能力(可共享服务)在客户端之间共享服务实例。Shareable 在 WCF 的 Beta1 或 Beta2 中,但在产品的最终版本发布之前被删除。但是文章说:

您可以重新使用基于 .NET Remoting 的 IRemoteFactory 接口并对其进行注释以与 WCF 兼容

保留引用(clent 对象图)部分也很有趣。

今天,您可以使用 InstanceContextMode.Single(和自定义客户端-服务-客户端对话逻辑)或IInstanceContextProvider在客户端(“共享实例”)之间进行交互

于 2013-03-01T11:37:10.153 回答