代码之家  ›  专栏  ›  技术社区  ›  Dario Solera

如何设计和实现一个简单的WCF服务中继?

  •  3
  • Dario Solera  · 技术社区  · 17 年前

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

    然而,我们希望将一些服务暴露给一些业务合作伙伴。他们可以访问的服务集取决于合同。一种标准架构。

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

    我如何在WCF中设计和实现这样一个中继/路由器,使其非常简单?我已阅读 Inside Windows Communication Foundation ,这是一本好书,但我对如何开始还不够有信心。

    3 回复  |  直到 10 年前
        1
  •  3
  •   Joseph DeCarlo    17 年前

    我做过类似的事情。您所能做的就是通过一个操作公开一个端点。

    那次行动看起来像

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

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

    做你需要做的事情来确定事情应该去哪里,但你需要更改“to”以转到你的内部端点。

    我实际上已经完全实现了这一点,所以如果你有任何问题,请告诉我。

    乔。

        2
  •  2
  •   Aaron Fischer    14 年前

    似乎只需按如下方式构建一个接口就足够了:

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

    我还发现 this post 有助于实施 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
  •  1
  •   Community Mohan Dere    9 年前

    查看 this SO question 其中一个答案表明。NET 4的路由服务。这是WCF的一个很好的补充。

    推荐文章