将服务引用添加到ASP.NET Web API服务。

18
我有一个MVC解决方案,用于托管Web API服务的几个路由。在某些情况下,我将使用简单的HTTP get从JavaScript调用这些服务。在另一些情况下,我想从一些.NET代码中调用它们,也许是另一个MVC应用程序。
是否有一种方法可以添加服务引用到这些Web API端点,并让工具创建代理客户端和CLR类型,就像Typical WCF服务一样?我知道这里没有涉及SOAP,但我确实读过这是可能的,只是不知道怎么做。
3个回答

18

不是SOAP服务,而是REST服务。REST服务通常并不会暴露用于创建服务引用代理的元数据(除了一些特殊形式的元数据,如 WCF 数据服务)。可以使用 Web API 的 HttpClient 类调用该服务。


感谢您的回复。因此,并没有像元数据模式这样公开的东西,但是您认为是否可以从响应中推导出类似于XSD对XML的模式。添加服务引用需要推导出某种模式,基于此构建CLR类,客户端本质上会将其反序列化为该集合。这是工具可能实际支持的内容,以在设计时提供使用此类型服务的灵活性。 - Daniel Revell
这是一个相当无力的借口。典型情况是您调用自己的服务 - 您始终拥有自己服务的元数据。这只是工具不足的问题。如果您需要 OData,则需要编写自己的 Linq 提供程序才能获得与旧版 WCF 服务一样的表现力,情况会变得更糟。更好的工具可以改变这种情况。 - John
@John:微软有很多个UserVoice网站。尝试提出请求(如果不存在的话),以添加对REST服务的WADL或WSDL2描述的支持。一旦描述可用,您还可以生成客户端。 - Ladislav Mrnka
@LadislavMrnka 经过更多的研究,我发现了项目“WebApiProxy”,它可以生成客户端代码,但它并不是非常高调,目前只支持C#和JavaScript。在线服务的描述可能是一个额外的好处,但我认为这更像是一个事后的想法。 - John

8
我们没有任何标准机制来完成这个。REST是关于构建允许客户端与服务器独立演进的系统。HTTP定义了GET、PUT、POST、DELETE等统一接口,因此不需要方法描述。出于以上两个原因,REST没有WSDL等效物,或者说没有真正获得REST社区认可的等效物(即有WADL)。
在REST服务中,耦合点实际上是媒体类型/消息体格式。为此,我们支持强类型机制。在Web API中,我们提供了一个HttpClient (Nuget 上的 HttpClient),可以将CLR类型转换为某种表示形式。它提供了XML和JSON的开箱即用支持。
因此,您可以创建CLR类型并与客户端共享,然后在客户端使用HttpClient。
要创建类型本身,也有几个选项。
  1. 手动创建
  2. 使用"粘贴为Xml"工具,并使用Web API的自动帮助页面功能来复制/粘贴。

1

虽然不是直接的方法,但从我看到的几个示例中,使用Web Api需要设置ServiceContract。如果您添加第二个服务契约接口,并按照要求添加常规OperationContract和DataContract属性,则可以创建一个具有标准WCF绑定及其匹配的MEX端点的终结点。服务将实现两个接口,因此添加服务引用可以从标准WCF终结点获取WSDL文档。


有一些细节需要考虑,例如序列化(应该在两种情况下保持一致以避免阻抗),重复的方法属性(这些在框架之间不兼容),还有身份验证和授权。我认为这可能会带来很多麻烦,得不偿失,但不管怎样,这是一个有趣的想法。 - John

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接