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

Web services 如何设计和实现一个简单的WCF服务中继?,web-services,wcf,authentication,routing,Web Services,Wcf,Authentication,Routing,我们正在使用WCF作为实现框架设计一个简单的面向服务的体系结构。有少数应用程序使用的服务。这些服务大多在内部使用,因此基本的身份验证和授权方案(如基于Windows的)就足够了 但是,我们希望向一些业务合作伙伴公开一些服务。他们可以访问的服务集取决于合同。一种标准的架构 我认为我们可以实现一个服务网关,它对请求进行身份验证,并将它们转发到正确的内部服务端点(这类似于简单的ESB),因此我们可以集中身份验证/授权代码,并向世界公开一个端点。我查看了一些可用的ESB工具包,但对于这个目的来说,它们似

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

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

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


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

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

那个手术看起来像

[OperationContract(Namespace="www.fu.com", Action="*")]
void CallThis(Message msg);
让您的客户端使用一个代理,该代理用于他们打算调用所需操作的服务。然后让他们更改配置以指向您的端点/服务。“CallThis”方法将接受任何操作,无论其签名如何。Message参数是WCF消息

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

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


Joe.

似乎构建一个如下的接口就足够了:

[OperationContract(Action="*", ReplyAction="*")]
Message CallThis(Message msg);
我还发现通过“摆弄”消息对象来实现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;
}
公共消息调用此(消息消息){
MessageBuffer=message.CreateBufferedCopy(524288);
消息输出=buffer.CreateMessage();
output.Headers.To=;
BasicHttpBinding=新的BasicHttpBinding();
IChannelFactory=binding.BuildChannelFactory();
factory.Open();
IRequestChannel=factory.CreateChannel(新端点地址());
通道打开();
消息结果=通道请求(输出);
message.Close();
output.Close();
工厂关闭();
channel.Close();
返回结果;
}

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

查看其中一个响应建议.NET 4路由服务的位置。非常好地添加到WCF。

谢谢,我正在探索此选项。问题是我不确定如何将内部服务生成的响应返回给外部请求者。这一点很好。我的实现使用单向消息,所以我不必处理它。使用Action=“*”属性将强制此调用在WCF堆栈中处于较高的位置。因此,在您的调用过程中不会发生类型序列化。您应该能够放置消息的返回类型,并且它应该可以工作。Dario:您应该仍然能够使用如上所述的捕获所有处理程序并返回消息实例;它不需要是单向操作。只是一个关于WCF路由的小提示。它不支持REST,据我所知,您必须发送SOAP。