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

时间:2010-12-28 18:04:53

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

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

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

我正在尝试阻止应用程序代码调用生成的代理的构造函数,因此人们不会在不执行自定义内容的情况下意外实例化代理。我的第一个想法是将生成的代码移动到与子代相关的独立程序集中,并确保应用程序代码仅具有对子程序集的引用。这大部分都有效,但是......

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

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

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

有什么想法吗?我正在使用WSDL.exe生成代理,并且没有选项来隐藏构造函数。还有另外一种方法,我只是失踪了吗?我想我可以编写一个工具,在代码生成后立即自动修改代理,但这对我来说感觉很难看。

由于

3 个答案:

答案 0 :(得分:2)

您是否坚持使用.NET 2.0?如果没有,那么你不应该使用WSDL.EXE。您应该使用SVCUTIL.EXE或“添加服务引用”。

您应该创建自己的包装类,而不是创建派生类,这些类使用代理类。人们可以使用像MyWrapper.CreateProxy()这样的东西,它会返回一个正确配置的代理类实例。

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

为什么不能覆盖GetWebRequest方法而不是这样做呢?无论如何都会在服务方法调用之前调用它。

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