3

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

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

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

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

4

3 回答 3

3

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

该操作看起来像

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

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

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

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

乔。

于 2008-12-15T14:31:36.480 回答
2

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

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

我还发现这篇文章对于通过“摆弄” 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;
}

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

于 2008-12-15T15:57:10.677 回答
1

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

于 2010-03-17T18:50:16.157 回答