添加对 ASP.NET Web API 服务的服务引用
Posted
技术标签:
【中文标题】添加对 ASP.NET Web API 服务的服务引用【英文标题】:Add service reference to ASP.NET Web API service 【发布时间】:2011-10-04 14:07:07 【问题描述】:我有一个 MVC 解决方案,它为 Web API 服务托管一些路由。在某些情况下,我会使用简单的 HTTP get 从 javascript 调用这些。在其他情况下,我想从一些 .NET 代码中调用它们,也许是另一个 MVC 应用程序。
有没有办法向这些 Web API 端点添加服务引用,并让工具像使用典型 WCF 服务一样创建代理客户端和 CLR 类型?我知道这里没有涉及 SOAP,但我确实读过它是可能的,只是不知道如何。
【问题讨论】:
【参考方案1】:不,它是 REST 服务。 REST 服务不公开用于通过服务引用创建代理的元数据(具有某种特殊形式的元数据的 WCF 数据服务除外)。使用 Web-API 的 HttpClient
类调用服务。
【讨论】:
感谢您的回复。所以没有像这样公开的元数据模式,但您认为可以从响应中派生一个,就像 xsd 对 XML 所做的那样。添加服务引用将需要派生某种模式,基于此构建一个 clr 类,并且客户端本质上将反序列化为它的集合。这是否是工具实际上可能支持的东西,以便在设计时提供使用此类服务的灵活性 这是一个很蹩脚的借口。这里的(典型)场景是您正在调用自己的服务 - 您始终拥有自己服务的元数据。这仅仅是一个劣质工具的问题。如果您想要 OData,情况会变得更糟:那么您将需要编写自己的 linq 提供程序,以获得您对旧 WCF 服务的表现力。更好的工具可以改变这一点。 @John:有很多由 MS 运营的 UserVoice 网站。尝试提出请求(如果它不存在)以添加对 REST 服务的 WADL 或 WSDL2 描述的支持。一旦描述可用,您还可以为客户生成一代。 @LadislavMrnka 经过更多研究后,我发现了“WebApiProxy”项目,它生成客户端代码,但它并不高调,目前仅支持 c# 和 javascript。在线提供服务描述可能是一个额外的好处,但我认为这更多是事后的想法。【参考方案2】:我们没有执行此操作的任何标准机制。 REST 是关于构建允许客户端独立于服务器发展的系统。 HTTP 定义了一个统一的 GET、PUT、POST、DELETE 等接口,因此不需要方法描述。出于这两个原因,没有 REST WSDL 等价物,或者我应该说没有在 REST 社区中真正获得动力的等价物(即有 WADL)。
REST 服务中的耦合点实际上是围绕媒体类型/正文格式。为此,我们确实支持强类型机制。在 Web API 中,我们发布了一个 HttpClient(Nuget 上的 HttpClient),它允许您采用 CLR 类型并转换为某种表示形式。开箱即用,它支持 XML 和 JSON。
因此您可以创建一个 CLR 类型并与客户端共享,然后在客户端上使用 HttpClient。
要创建类型本身,还有几个选项。
-
手工制作
使用“粘贴为 Xml”工具并使用 web api 的自动帮助页面功能进行复制/粘贴。
【讨论】:
【参考方案3】:不是直接的,而是从我看到的几个示例中,使用 Web Api 涉及设置 ServiceContract。似乎如果您根据需要添加具有常规 OperationContract 和 DataContract 属性的第二个服务合同接口,那么您可以使用您选择的标准 WCF 绑定及其匹配的 MEX 端点创建一个端点。该服务将实现这两个接口,因此添加服务引用可以从标准 WCF 端点获取 WSDL 文档。
【讨论】:
有一些细节需要考虑,比如序列化(两种情况下都应该相同,以避免阻抗),重复的方法属性(框架之间不兼容),还有身份验证和授权。我怀疑这是一个不值得好处的麻烦,但这仍然是一个有趣的想法。以上是关于添加对 ASP.NET Web API 服务的服务引用的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET Core Web API InvalidOperationException:无法解析服务 [重复]