c# - 防止在生成的 Web 服务代理上使用默认构造函数

标签 c# code-generation asmx .net-1.1 webservice-client

我遇到这样一种情况,我需要使用多个 Web 服务。我需要能够在进行任何调用之前在代理的构造函数中执行自定义操作(分配配置的 URL、分配 SOAP header 等)。

我的第一个解决方案是创建一个从生成的代理派生的子类,然后在子类的构造函数中执行这些操作。这样,应用程序代码就可以调用子项的构造函数,并获得具有我需要的内容的有效代理。

我试图阻止应用程序代码调用生成的代理的构造函数,这样人们就不会在没有执行我的自定义操作的情况下意外地实例化代理。我的第一个想法是将生成的代码从子程序集移到一个单独的程序集中,并确保应用程序代码仅引用子程序集。这在大多数情况下都有效,但是......

服务包含在代理中定义的复杂类型。我需要应用程序代码来引用这些类,这意味着应用程序代码无论如何都需要引用基础程序集,这意味着它们现在可以访问生成的构造函数。

我已经尝试了一种过于复杂的解决方案,即将每个生成的复杂类型包装在一个接口(interface)中,然后隐藏真正的调用并用作为接口(interface)类型的对象的副本替换它们。这工作了一两次,但它很快就会变得丑陋。

似乎我可以拥有我想要的一切的唯一方法是删除生成的代理的公共(public)构造函数,并用 protected 构造函数替换它,然后允许引用这个程序集 - 他们将能够使用复杂类型,但无法调用构造函数。我的问题是,我能想到的唯一方法是操纵生成的代码来更改构造函数。

有什么想法吗?我正在使用 WSDL.exe 生成代理,那里没有隐藏构造函数的选项。还有另一种我想念的方法吗?我想我可以编写一个工具来在代理生成后立即自动修改它,但我觉得这很难看。

谢谢

最佳答案

您是否一直在使用 .NET 2.0?如果不是,那么您不应该使用 WSDL.EXE。您应该使用 SVCUTIL.EXE 或“添加服务引用”。

您应该创建自己的包装类,而不是创建派生类,它使用代理类。可以使用类似 MyWrapper.CreateProxy() 的方法,它会返回一个正确配置的代理类实例。

顺便说一句,WSDL.EXE 使用遗留的“ASMX”技术创建代理,该技术无法使用服务中的类型。

关于c# - 防止在生成的 Web 服务代理上使用默认构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4548207/

相关文章:

unit-testing - 测试 - 生成不符合架构的 xml 文件

c# - 如何在.net中的Web服务中调度[WebMethod]?

javascript - $.ajax - 发送数据属性对象

c# - ADO.Net Entity Framework 事务

c# - 基础设施服务能否返回 Bob 大叔的 The Clean Architecture 中的领域实体?

javascript - 根据是否勾选更改复选框的值?

android - 从 Android 错误 : "java.io.IOException:HTTP request failed, HTTP status: 500" 调用 asmx web 服务

c# - 我需要有关 C# 运算符的帮助

使用 Discord 机器人进行 C# 时间减法

java - 将代码插入方法 - Java