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

C# 防止在生成的web服务代理上使用默认构造函数,c#,code-generation,asmx,.net-1.1,webservice-client,C#,Code Generation,Asmx,.net 1.1,Webservice Client,我遇到了一种情况,我需要使用几个web服务。在进行任何调用之前(分配配置的URL、分配SOAP头等),我需要能够在代理的构造函数中执行自定义操作 我的第一个解决方案是创建从生成的代理派生的子类,然后在子类的构造函数中执行这些操作。这样,应用程序代码就可以调用子级的构造函数,并获得一个有效的代理,该代理包含我需要的内容 我试图阻止应用程序代码调用生成的代理的构造函数,这样人们就不会在不执行我的自定义操作的情况下意外地实例化代理。我的第一个想法是将生成的代码从子程序集中移动到一个单独的程序集中,并确

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

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

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

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

我尝试过一种过于复杂的解决方案,将生成的每个复杂类型包装到接口中,然后隐藏真正的调用,并将它们替换为对象的副本作为接口类型。这种方法奏效一两次,但很快就会变丑

似乎我能拥有我想要的一切的唯一方法是删除生成的代理的公共构造函数,并用受保护的构造函数替换它,然后允许引用此程序集-它们将能够处理复杂类型,但不能调用构造函数。我的问题是,我能想到的唯一方法是操纵生成的代码来更改构造函数

有什么想法吗?我使用WSDL.exe生成代理,并且没有隐藏构造函数的选项。有没有其他我错过的方式?我想我可以编写一个工具,在代理生成后立即自动修改代理,但我觉得这很难看


谢谢

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

您不应该创建派生类,而应该创建自己的包装器类,这些包装器类使用代理类。可以使用类似于
MyWrapper.CreateProxy()
的东西,它将返回正确配置的代理类实例


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

与其这样做,为什么不能重写GetWebRequest方法?无论如何,它将在服务方法调用之前被调用


如果您添加了服务引用,那么实现消息检查器也会做同样的事情。

我最后修改了代理生成的代码,使构造函数受到保护,而不是公开的。对WSDL.exe的调用已经在一个自动化项目中处理过了,所以这没什么大不了的。这真的是我能得到我想要的一切的唯一方法。

Aah…被HTTP头搞糊涂了doh:谢谢-我实际上正在从.NET 1.1升级到.NET 4.0-已经为这些服务设置了大量配置。看看svcutil,我认为它需要进行重大的配置更改,这是我们目前无法做到的。此外,生成的类似乎要求将SoapHeader对象传递到每个服务方法中-因此,如果我的包装器只是返回代理本身,应用程序代码每次都必须创建该SoapHeader对象,这是我试图避免的事情之一。