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

时间:2008-12-15 14:08:32

标签: web-services wcf authentication routing

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

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

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

如何在WCF中设计和实现这样的中继/路由器,保持简单?我读过Inside Windows Communication Foundation,这是一本好书,但我对如何开始还不够自信。

3 个答案:

答案 0 :(得分:3)

我做了类似的事情。您可以做的是通过单个操作公开端点。

该操作看起来像

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

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

执行您需要做的事情以确定应该去哪里,但您需要更改“收件人”以转到内部端点。

我实际上已完全实现了这一点,所以如果您有疑问,请告诉我。

乔。

答案 1 :(得分: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;
}

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

答案 2 :(得分:1)

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