为 Rest Web 服务创建 WCF 代理
Posted
技术标签:
【中文标题】为 Rest Web 服务创建 WCF 代理【英文标题】:Create a WCF Proxy for a Rest Web Service 【发布时间】:2011-08-26 18:24:19 【问题描述】:我有一个复杂的 WCF Rest 服务,它接受多个输入和对象。我不能简单地通过在 Fiddler 中执行 HTTP POST 来调用它,因为要提供的数据太多(我可以,但它会永远占用我)。所以我想使用代理在代码中做到这一点。有没有办法为 .NET 4 WCF Rest Service 生成代理?否则,你有什么建议让我轻松测试服务?
谢谢。
【问题讨论】:
【参考方案1】:svcutil.exe 将创建一个代理类,您可以在调用应用程序中使用该代理类,它允许您调用适当的方法并在代码中传递参数
【讨论】:
svcutil 不适用于 REST 端点 - 它不理解 [WebGet] 或 [WebInvoke] 等属性,因为它们未在服务的 WSDL/元数据中公开。【参考方案2】:您可以使用与非 RESTful WCF 服务相同的步骤创建代理:
// Create the proxy
ChannelFactory<IContract> channelFactory = new ChannelFactory<IContract>("endpointName");
var restfulProxy = factory.CreateChannel();
// Invoke a method
var response = proxy.MyRestfulMethod("param1", "param2");
【讨论】:
如果配置中定义的“端点”正确设置了适当的绑定(例如WebHttpBinding)和行为(例如WebHttpBehavior),这将起作用,但出于测试目的,我发现它通常更容易保留所有信息都集中在一个地方(代码)。【参考方案3】:没有为 WCF REST 服务创建代理的标准方法(没有用于 REST 的 WSDL,一种新兴标准 WADL,并未被广泛采用,WCF 也不支持它)。出于测试目的,您应该与客户端共享接口,并使用 ChannelFactory
假设接口被称为 ITest,这就是你所拥有的:
Uri serviceUri = new Uri("http://my.service.com/endpoint");
WebChannelFactory<ITest> factory = new WebChannelFactory<ITest>(serviceUri);
ITest proxy = factory.CreateChannel();
Assert.AreEqual(9, proxy.Add(4, 5));
【讨论】:
【参考方案4】:虽然目前没有使用 WCF REST 服务创建代理的标准方法,但您可以使用 REST Starter kit 中的“将 XML 粘贴为类型”工具来执行此操作。这适用于默认 WCF /help 页面中显示的 xml,并生成与结构匹配且可以使用的 C# 类。另外,请观看此视频以了解它的实际效果 - Consumer Twitter in 3 minutes。
【讨论】:
以上是关于为 Rest Web 服务创建 WCF 代理的主要内容,如果未能解决你的问题,请参考以下文章
WCF、Web API、WCF REST 和 Web 服务之间的区别?
ASP.Net Web API 与 WCF - Web API 能否用于向单例 WCF 服务提供基于 REST 的通信?