如何从 wsdl 生成 Web 服务

Posted

技术标签:

【中文标题】如何从 wsdl 生成 Web 服务【英文标题】:how to generate web service out of wsdl 【发布时间】:2010-11-26 13:35:51 【问题描述】:

客户端为我提供了生成 Web 服务的 wsdl。但是当我使用 wsdl.exe 命令时,它生成了 .cs 类。我在我的 Web 服务中使用了该类,当我向客户端提供 wsdl 时,它与他们的架构不匹配。实际上,我希望从 wsdl 自动生成 .asmx,以便我可以填写 web 方法。这样它将完全匹配他们的架构。 希望有意义。

【问题讨论】:

其实我也试过 wsdl.exe /server 或 /serverinterface 它仍在生成 .cs 类。 【参考方案1】:

如何使用wsdl /serverwsdl /serverinterface 开关? 据我了解 wsdl.exe 命令行属性,这就是您要查找的内容。

- ADVANCED -

/服务器

Server switch has been deprecated. Please use /serverInterface instead.
Generate an abstract class for an xml web service implementation using
ASP.NET based on the contracts. The default is to generate client proxy
classes.

另一方面:您为什么要创建过时的技术解决方案?为什么不将此 Web 服务创建为 WCF 服务。这是当前更现代、更灵活的方式!

马克


更新:

当我在 WSDL 文件上使用 wsdl /server 时,我创建了这个文件:

[WebService(Namespace="http://.......")]
public abstract partial class OneCrmServiceType : System.Web.Services.WebService 

    /// <remarks/>
    [WebMethod]
    public abstract void OrderCreated(......);

这基本上与将 ASMX 文件添加到解决方案时生成的代码几乎完全相同(在文件背后的代码 - “yourservice.asmx.cs”中)。我认为您无法更接近从 WSDL 文件创建 ASMX 文件。

您始终可以手动添加“yourservice.asmx”——它实际上并不包含太多内容:

<%@ WebService Language="C#" CodeBehind="YourService.asmx.cs" 
      Class="YourServiceNamespace.YourServiceClass" %>

【讨论】:

不,这实际上不是我要找的。它会生成我不想要的代理类。我想自动生成 abc.asmx。我想到了 WCF,但通过制作变得简单网络服务。【参考方案2】:

您不能保证自动生成的 WSDL 将与您从中创建服务接口的 WSDL 匹配。

在您的场景中,您应该将 WSDL 文件放在您网站上的某个位置,并让消费者使用该 URL。您应该在 web.config 中禁用Documentation 协议,这样“?wsdl”就不会返回 WSDL。见&lt;protocols&gt; Element。

另外,请注意该文章的第一段:

本主题专门针对旧技术。现在应该使用Windows Communication Foundation (WCF) 创建 XML Web 服务和 XML Web 服务客户端。

【讨论】:

【参考方案3】:

不幸的是,对于您正在寻找的东西,没有灵丹妙药的解决方案。您可以执行以下操作:

在 Visual Studio 命令提示符窗口中使用此命令创建一个接口类:

wsdl.exe yourFile.wsdl /l:CS /serverInterface 使用 VB 或 CS 作为您选择的语言。这将创建一个新的 .cs.vb 文件。

创建一个新的 .NET Web 服务项目。将现有文件导入您的项目 - 在上述步骤中创建的文件。

在 Code-View 的 .asmx.cs 文件中,修改您的类:

 

 public class MyWebService : System.Web.Services.WebService, IMyWsdlInterface
     
     [WebMethod]
     public string GetSomeString()
     
         //you'll have to write your own business logic 
         return "Hello SOAP World";
     
 

【讨论】:

也可以put /out:"path\to\folder" 将生成的代码放到某个位置。 命令wsdl.exe C:Folder\File.wsdl /l:CS /ServerInterface /out:C:Folder 为我做了。对于所有在命令提示符下无法识别wsdl.exe 的人:您可以在Developer Command Prompt for VS 2017 中使用它(安装VS17 时在开始下找到)【参考方案4】:

您可以使用 thinktecture.com 上的 WSCF(Web Services Contract First)工具生成 WS 代理类。所以本质上,您可以从 wsdl 中创建 web 服务。创建 asmx,也许不是,但这很容易,不是吗?该工具完美地集成到 VS2005-8(2010/WCF 的新版本,称为 WSCF-blue)。我已经使用它加载并且总是发现它非常好。

【讨论】:

我也会注意到这一点,尽管我自己从来没有这么幸运(尤其是 WSCF Blue)。也许我使用了早期版本或其他东西。【参考方案5】:

这可能回答得太晚了。但可能对有需要的人有帮助: 如何将 WSDL 转换为 SVC:

    假设您的 .wsdl 文件位于“E:\”位置,以便于进一步访问。 将每个 .wsdl 文件的命令准备为:E:\YourServiceFileName.wsdl 权限:假设您拥有执行权限的管理权限。打开目录:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin 右键单击 amd64 => 安全 => 编辑 => 添加用户 => 所有人或当前用户 => 允许所有权限 => 确定。 在文本编辑器中为每个文件准备命令:wsdl.exe E:\YourServiceFileName.wsdl /l:CS /server。 现在从以下位置打开 Visual Studio 命令提示符:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\Shortcuts\VS2013 x64 Native Tools 命令提示符。 执行上述命令。

    转到目录:C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64,应在其中生成相应的 .CS 文件。

    9.将生成的 CS 文件移动到合适的位置。

【讨论】:

这是 vs cmd 窗口中最简单直接的方法。【参考方案6】:

第一步

open -> Visual Studio 2017 Developer Command Prompt

第二步

WSDL.exe  /OUT:myFile.cs WSDLURL  /Language:CS /serverInterface
/serverInterface(用于从 wsdl 文件创建接口) WSDL.exe(这个用来从wsdl创建类。这个是.net自带的 /OUT:(输出文件名)

第二步

新建“Web 服务项目”

第三步

添加 -> 网络服务

第四步

myFile.cs 复制所有代码(在上面生成),除了 “使用类” 例如:

 /// <remarks/>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
    [System.Web.Services.WebServiceBindingAttribute(Name="calculoterServiceSoap",Namespace="http://tempuri.org/")]

public interface ICalculoterServiceSoap 

    /// <remarks/>
    [System.Web.Services.WebMethodAttribute()]
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/addition", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    string addition(int firtNo, int secNo);

第四步

将其粘贴到上面在步骤 2 中创建的 webService.asmx.csnamespace 内部)

第五步

用你的网络服务类继承接口类 例如:

public class WebService2 : ICalculoterServiceSoap

【讨论】:

以上是关于如何从 wsdl 生成 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章

如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?

如何仅针对某些端点从 WSDL 生成 WCF 客户端?

导入 Exchange Web 服务 (EWS) wsdl 文件时如何修复未解析的类型?

如何避免需要在 CXF 或 JAX-WS 生成的 Web 服务客户端中指定 WSDL 位置?

从 WSDL 文件生成 Web 服务 [关闭]

从 wsdl 生成 web 服务