是否有任何工具从服务器端组件ASMX代理?(Are there any tools to build

2019-08-02 01:28发布

我们有一组实现Web服务业务组件。

要建立客户端代理,我们首先在服务器上构建和部署Web服务(组件和ASMX文件)。

然后我们使用Wsdl.exe用指向ASMX端点和生成类客户端代理。

我已经看到了可以创建使用Wsdl.exe用或disco.exe的代理(而不是ASMX端点)从WSDL文件。


有没有产生从服务器组件WSDL文件,或者直接代理类,而不需要使用网络服务器的工具吗?


更新:

首先,我想说我很欣赏你们考虑到投入到这个时间。 我还想说,我知道这是多么困难不知道给定方案的所有细节提出建议。 这就是说,让我更详细方案,解决你们做了一些要点:

1)这是一个有点大项目已经发展了几年了。 使用ASMX Web服务的决定是WCF的存在之前完成。

2)我已经想过写我们自己的代理生成,并且可能是一种选择,如果我们没有找到一个工具,做它。

3)我们仍然要绑定的WSDL合同。 我试图避免是在生成过程中有一个Web服务器上的依赖。

4)我们已经自动生成了自动构建运行在TFS建立和已经不是问题本身的代理。 这个问题,有人告诉我,是有到构建分成两个部分:服务器和客户端。 有可能的替代品,以避免使用一些花哨的MSBuild任务拆分,但我对这个问题的知识是有限的。

5)我确实希望构建刹车上TFS生成,如果客户端代码和服务器端代码在编译中没有匹配。 这应该已在开发人员的机器在办理入住手续之前得到解决。

6)我们在服务器和客户端的部分严格控制。 这组Web服务作为后端到点击一次Windows窗体应用程序。 一切都在企业内部网上运行。 每次合同的变更,它是在串联与客户端应用程序的新版本完成。

7)WCF是不是在这组Web服务的短期的选项。 当我加入这个项目在一年前,我被赋予了与其他内部系统的互操作性创造了一套新的Web服务的任务。 这些Web服务设计的前期是很容易升级到WCF一次高层管理人员允许我们使用WCF。 我得看看到svcutil.exe的,但如果它做什么,我们需要的,我将有另一点在试图说服高层管理人员采用WCF。

Answer 1:

那么,这两个经典的ASMX Web服务和现代化的WCF服务有自动生成WSDL为你的能力。 如果你去的URL Web服务端点,你可以简单地通过增加?WSDL的URL的末尾获得WSDL。 您通常不希望产生从服务本身... Web服务的点是从代码中分离出你,并让你绑定到合同的代码代理(这是WSDL是什么...合同。)您可以生成几种方法的客户机代理...要么Wsdl.exe用,svcutil.exe的,或通过Visual Studio的“添加Web引用”或“添加服务引用”选项。

如果你真的需要,你可以写你自己的代理生成器。 我最近写了一个动态代理生成器,允许通过温莎城堡IOC容器使用轻量级代码生成(ILEmit)在运行时生成WCF服务代理。 有很多种选择,但关键是你绑定到WSDL(您的合同),而不是服务的实际C#代码。 最理想的办法是写的WSDL,并同时生成客户端代理和服务合同接口,并从WSDL数据/信息合同。 这就是所谓的契约优先服务的发展,也有少数产品为.NET允许契约优先发展。

编辑:

你评论说,我并没有真正回答你的问题。 也许这是真的,但是,没有真正很好地回答你的问题。 您正在尝试自动生成上构建一个客户端代理。 这实在不是一个好主意,并可能会导致一些显著的构建问题时,你的服务的变化。

的示例场景。 假设你有IServiceA,它具有采用数据合同作为一个参数一个方法,并返回一个不同的数据合同的结果:

[ServiceContract]
public interface IServiceA
{
    [OperationContract]
    SecureOutput SomeSecureOperation(SecureInput input);
}

public class SecureInput
{
    public UserCredentials Credentials { get; set; }
    public byte[] EncryptedData { get; set; }
}

public class SecureOutput
{
    public byte[] EncryptedData { get; set; }
}

比方说,上述服务利用同步加密来加密和解密所述数据,但是这是后来确定为不安全的。 因此,在更改数据合同:

[ServiceContract]
public interface IServiceA
{
    [OperationContract]
    SecureOutput SomeSecureOperation(SecureInput input);

    [OperationContract]
    byte[] GetPublicKey();
}

public class SecureInput
{
    public UserCredentials Credentials { get; set; }
    public byte[] UserPublicKey { get; set; }
    public byte[] EncryptedData { get; set; }
}

public class SecureOutput
{
    public byte[] EncryptedData { get; set; }
}

该服务现在利用异步加密,并使用用户的公钥来加密返回数据。 该服务还具有一个新的操作,让客户获得服务的公共密钥,使他们可以加密的输入数据。 您的服务合同已经改变,并要求您更新客户端代码。 你应该版本为您服务......但我们正在处理的安全性,和老人们必须有利于新的维护安全的被废弃。 如果您自动生成在编译的时候你的客户端代理,你有一个严重的问题。 你的客户端代码不再与新的代理兼容,并且您的构建失败。

当使用Web服务打交道时,最好是手动处理代理的生成。 如果代理需要重新生成(其中,如果你正确版本的服务,合同一旦固化应该是罕见的),那么你就不能简单地产生不打破东西。 您将需要生成代理,然后更新任何消耗它与新的界面一致。 我想不出任何场景,我会想我的生成在构建时代理的,我也不会想再生我的代理每次构建。 我不建议这样的情景给任何人,无论是。 我不直接回答你的问题道歉,但我希望我的解释会帮助你建立一个更好的解决方案。



Answer 2:

你可以使用ServiceDescriptionReflector从一个集生成WSDL文件。

请参见本指南: http://www.pluralsight.com/community/blogs/craig/archive/2004/10/18/2877.aspx

编辑:

与ServiceDescriptionReflector生成WSDL后,您可以使用Wsdl.exe工具来生成代理类。



Answer 3:

我已经创建了包含一个或多个web一个工具,它可以生成从编译的C#组件(DLL)的WSDL文件。 通常你需要它承载的.asmx正在运行的服务(IIS或其他方式),这样就可以检索使用/MyWebService.asmx?wsdl的WSDL

此工具使用反射来检索来自一个组件(DLL)的所有信息生成的WSDL文件。

下载可以在这里找到http://wsdlgenerator.codeplex.com



Answer 4:

有没有办法与ASMX Web服务来做到这一点。

然而,由于微软称:ASMX Web服务是一种“传统技术” ,这可能是一个很好的时间让你去想迁移ASP.NET Web服务到WCF 。

原因是, svcutil.exe可以从编译的程序集,您应该然后能够扭亏为盈,并使用创建的代理代码,还使用导出元数据svcutil.exe

我同意从答案jrista :代理代码是一种生成的代码,我不认为它应该在构建过程中产生。 它应通过的显影剂中产生和应,实际上,被检查到源控制。



文章来源: Are there any tools to build ASMX proxies from server side assemblies?