如何使用 WSDL

Posted

技术标签:

【中文标题】如何使用 WSDL【英文标题】:How to use a WSDL 【发布时间】:2010-11-21 02:41:25 【问题描述】:

我需要使用 Web 服务。他们向我发送了 WSDL 文件。 我应该怎么做才能将它添加到我的网站并开始使用它作为代理。 (如果我将它放在虚拟目录中,它可以被发现,但它是否授予我与真实 Web 服务的连接?)

【问题讨论】:

好吧,我投了赞成票,因为我认为这里的其他用户会从看到答案中受益。我正在寻找这个确切的问题,我很高兴在这里找到它。 我了解 MS 参与了 WSDL 的早期开发,因此可以了解 VS 和 .NET 中支持这一点的功能,如下所示非常有帮助。然而,鉴于问题并不是真正的平台细节,是否有可能进一步增强这一点以提供替代方法(即 Java、Python 等)? 【参考方案1】:

我会启动 Visual Studio,创建一个 Web 项目(或控制台应用程序 - 没关系)。

对于 .Net 标准:

    我会右键单击项目并从 添加 上下文菜单中选择“添加服务引用”。 我会点击高级,然后点击添加服务参考。 我将获取 wsdl 的完整文件路径并粘贴到地址栏中。然后发射箭头(开始按钮)。 如果尝试加载文件时出错,则必须有一个损坏且未解析的 url 文件需要解析,如下所示: 有关如何修复的信息,请参阅此答案: *** answer to: Unable to create service reference for wsdl file

如果没有错误,您只需设置要用于访问服务的 NameSpace,它就会为您生成。

对于.Net Core

    我会右键单击该项目并从“添加”上下文菜单中选择“连接的服务”。 我会从列表中选择 Microsoft WCF Web Service Reference Provider。 我会按下浏览并立即选择 wsdl 文件,设置命名空间,我很高兴。 如果遇到任何错误,请参阅上面的错误修复网址。

以上任何一种方法都会生成一个简单、非常基本的 WCF 客户端供您使用。您应该在生成的代码中找到“YourservicenameClient”类。

出于参考目的,生成的 cs 文件可以在您的 Obj/debug(或 release)/XsdGeneratedCode 中找到,并且您仍然可以在 TempPE 文件夹中找到 dll。

创建的服务应该为 WSDL 契约中定义的每个方法提供方法。

实例化客户端并调用你想调用的方法——就是这样!

YourServiceClient client = new YourServiceClient();
client.SayHello("World!");

如果需要指定远程URL(不使用默认创建的),可以在代理客户端的构造函数中轻松完成:

YourServiceClient client = new YourServiceClient("configName", "remoteURL");

configName 是要使用的端点的名称(您将使用除 URL 之外的所有设置),remoteURL 是表示要连接到的 URL 的字符串(而不是配置中包含的那个) )。

【讨论】:

这很好用。只有一个问题,如果我的机器上有 wsdl 文件,我会添加对这个文件的引用。执行 URL 时,它命中的是托管 Web 服务的 URL,还是我必须指定 Binding 和 EndPoint? 这取决于您 - 默认情况下,为客户端代理创建的代码将具有包含在 WSDL 中的 URL - 如果您需要转到另一个 URL,则需要自己指定。 为什么这么简单?没有一个陷阱吗? :p 谢谢! 作为公认的答案,如果您还提到如何从 URL 使用 Web 托管的 WSDL,那就太好了。 我想我已经很接近让它发挥作用了。我使用添加服务参考工具安装了 Web 服务。我能够实例化客户端,但调用方法是我失败的地方。终点是使用 Java 实现,我能看到的只是 XML。我试图调用的方法是寻找客户端 ID 和“其他东西”。别的东西就是一个类。这令人费解。如果有帮助,我可以把它放在下面的帖子中,但我很困惑。【参考方案2】:

如果你想在 .Net Core project 中添加 wsdl 引用,则没有“添加 web 引用”选项。

要添加 wsdl 引用,请转到解决方案资源管理器,右键单击“引用”项目项,然后单击添加连接的服务选项

然后点击“Microsoft WCF Web 服务参考”:

在 URI 文本框中输入文件路径并导入 WSDL:

它将生成一个简单、非常基本的 WCF 客户端,您可以像这样使用它:

YourServiceClient client = new YourServiceClient();
client.DoSomething();

【讨论】:

我看不到这个扩展。【参考方案3】:

使用WSDL.EXE utility 从 WSDL 生成 Web 服务代理。

您将获得一个长长的 C# 源文件,其中包含一个如下所示的类:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="MyService", Namespace="http://myservice.com/myservice")]
public partial class MyService : System.Web.Services.Protocols.SoapHttpClientProtocol 
    ...

在您的客户端、使用 Web 服务的代码中:

    实例化 MyService。 设置其 Url 属性 调用 Web 方法

【讨论】:

这创建了一个“老式”的 ASMX Web 服务——这些已经过时了——现在应该改用 WCF【参考方案4】:

在视觉工作室。

创建或打开一个项目。 在解决方案资源管理器中右键单击项目。 选择“添加服务参考” 使用您收到的 WSDL 粘贴地址。 点击确定。

如果没有错误,您应该可以在对象浏览器中看到服务引用和所有相关方法。

【讨论】:

OP 没有地址,只有文件。 Web 服务的提供者可能禁用了 WSDL(通过默默无闻的安全性),因此没有可以访问 WSDL 的 URL,然后在 VS 中添加 Web 引用将不起作用。但是,提供商确实希望您(我的意思是 OP)知道您需要了解的有关服务合同的所有信息,这就是他们发送 WSDL 文件的原因。现在 OP 需要从中生成代理代码,问题是如何。 通过输入文件的路径。是什么让您认为这行不通? 嗨@vidalsasoon。您能否简要解释一下如何使用我在课程资源管理器中看到的这些课程。 ?

以上是关于如何使用 WSDL的主要内容,如果未能解决你的问题,请参考以下文章

如何使用CXF将 wsdl 文件变成java文件

如何使用 WSDL

如何使用onvif ptz wsdl

如何在 PHP 4 中使用 SOAP/WSDL?

如何使用 Eclipse 将 WSDL 转换为 Java 类?

如何使用 Axis WSDL2Java 生成的文件?