如何从 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 /server
或wsdl /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。见<protocols>
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.cs(namespace 内部)
第五步
用你的网络服务类继承接口类 例如:
public class WebService2 : ICalculoterServiceSoap
【讨论】:
以上是关于如何从 wsdl 生成 Web 服务的主要内容,如果未能解决你的问题,请参考以下文章
如何避免在CXF或JAX-WS生成的Web服务客户端中指定WSDL位置?
导入 Exchange Web 服务 (EWS) wsdl 文件时如何修复未解析的类型?