【问题标题】:How to design and implement a simple WCF service relay?如何设计和实现一个简单的 WCF 服务中继?
【发布时间】:2008-12-15 14:08:32
【问题描述】:

我们正在设计一个使用 WCF 作为实现框架的简单的面向服务的架构。少数应用程序使用了一些服务。这些服务大多在内部使用,因此一个基本的身份验证和授权方案(例如基于 Windows)就足够了。

但是,我们希望向某些业务合作伙伴公开一些服务。他们可以访问的服务集取决于合同。一种标准架构。

我认为我们可以实现一个服务网关,它对请求进行身份验证并将它们中继到正确的内部服务端点(这类似于简单的 ESB),因此我们可以集中身份验证/授权代码并公开一个世界的单一端点。我查看了一些可用的 ESB 工具包,但对于此目的而言,它们似乎过于复杂。我们不需要集成很多不同的服务,只需要将其中的一些服务公开到互联网上。

如何在 WCF 中设计和实现这样的中继/路由器,同时保持非常简单?我读过Inside Windows Communication Foundation,这是一本好书,但我仍然对如何开始没有足够的信心。

【问题讨论】:

    标签: web-services wcf authentication routing


    【解决方案1】:

    我做过与此非常相似的事情。您可以做的是通过单个操作公开一个端点。

    该操作看起来像

    [OperationContract(Namespace="www.fu.com", Action="*")]
    void CallThis(Message msg);
    

    让您的客户使用一个代理,该代理是为他们打算调用他们想要的操作的服务而设计的。然后让他们更改配置以指向您的端点/服务。 “CallThis”方法将接受任何操作,无论其签名如何。 Message 参数是 WCF 消息。

    做你需要做的事情来确定事情应该去哪里,但是你需要改变“To”去你的内部端点。

    我实际上有一个完整的实现,所以如果您有任何问题,请告诉我。

    乔。

    【讨论】:

    • 谢谢,我正在探索这个选项。问题是我不确定如何将内部服务生成的响应返回给外部请求者。
    • 好点。我的实现使用单向消息,所以我不必处理它。使用 Action="*" 属性会强制此调用在 WCF 堆栈中更高。因此,在您的调用期间不会发生类型序列化。您应该能够输入 Message 的返回类型并且它应该可以工作。
    • Dario:你应该仍然可以像上面那样使用 catch all 处理程序并返回一个 Message 实例;它不需要是单向操作。
    【解决方案2】:

    似乎构建如下界面就足够了:

    [OperationContract(Action="*", ReplyAction="*")]
    Message CallThis(Message msg);
    

    我还发现this post 通过“摆弄”Message 对象来实现 CallThis 方法很有用。 CallThis 方法的基本实现如下:

    public Message CallThis(Message message) {
        MessageBuffer buffer = message.CreateBufferedCopy(524288);
        Message output = buffer.CreateMessage();
        output.Headers.To = <INTERNAL_SERVICE_URI>;
    
        BasicHttpBinding binding = new BasicHttpBinding();
        IChannelFactory<IRequestChannel> factory = binding.BuildChannelFactory<IRequestChannel>(<INTERNAL_SERVICE_URI>);
        factory.Open();
    
        IRequestChannel channel = factory.CreateChannel(new EndpointAddress(<INTERNAL_SERVICE_URI>));
        channel.Open();
    
        Message result = channel.Request(output);
    
        message.Close();
        output.Close();
        factory.Close();
        channel.Close();
    
        return result;
    }
    

    添加身份验证和授权应该非常简单。

    【讨论】:

      【解决方案3】:

      查看this SO question,其中一个响应建议使用 .NET 4 的 RoutingService。对 WCF 的非常好的补充。

      【讨论】:

      • 请注意:WCF 的路由。它不支持 REST,据我所知,您必须发送 SOAP。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多