如何在不修改生成的类的情况下将SoapExtension属性添加到生成的Web服务客户端代理?

时间:2009-03-12 21:13:25

标签: c# web-services soap proxy wsdl

我创建了一个SoapExtension类来捕获来自特定Web服务调用的soap请求和响应。为了使这个SoapExtension生效,我必须在生成的代理客户端中为方法添加一个属性。

例如,我已将AuditSoapCapture属性添加到此方法中:

    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://blahblah.com/webservices/AddressSearch", RequestNamespace = "http://blahblah.com/webservices/", ResponseNamespace = "http://blahblah.com/webservices/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
    [blahblah.TriadLite.Core.AuditSoapCapture]
    public System.Data.DataSet AddressSearch(string HouseNumber, string StreetName, string ZipCode) {
        object[] results = this.Invoke("AddressSearch", new object[] {
                    HouseNumber,
                    StreetName,
                    ZipCode});
        return ((System.Data.DataSet)(results[0]));
    }

我正在寻找一种方法来将此属性添加到特定方法而不修改生成的客户端代理,因为它们会在重新生成时丢失。我可以在另一个部分类或接口或其他方式中执行此操作吗?

谢谢!

4 个答案:

答案 0 :(得分:1)

不幸的是,您需要修改代理代码。你提到的其他可能性不起作用 - 一个parial类不会覆盖现有的功能,并且我无法知道如何获得一个接口来做你需要的东西(因为甚至没有办法让它复杂化)代理生成器知道您打算实现一个接口。)

我过去所做的一些事情,在你可以访问webservice源的情况下,就是编写一个小应用程序来解析.asmx.cs文件中的代码(作为文本)。 webservice用于提取使用[WebMethod]标记的所有方法的名称。然后,应用程序通过在代理方法上插入适当的属性来“修复”References.cs,基于某些设置文件或某些设置。这很有效,因为代理中的命名约定非常巧妙地映射到原始服务中的方法名称。

答案 1 :(得分:1)

我可能最后通过将其放入Web.config来注入我的SoapExtension。这将导致它在没有客户端代理方法属性的每个WS调用上运行。然后,我将修改SoapExtension以在列表中查找被调用的WS方法名称,如果它在列表中,则执行其余的SoapExtension逻辑。我认为这个小批量应用程序中列表中的命中不会破坏性能。

答案 2 :(得分:1)

6年前发布了这个...所以不确定这是否会对此有所帮助。

我遇到类似的事情,调用旧的SOAP Web服务,该服务具有动态生成的代理类,我们不想修改它,因为它是由项目从wsdl自动生成的。为了解决这个问题,我们就是这样做的。

  • wsdl.exe生成的代理类是一个分部类。我们像这样扩展了这个类,以便在soapextension中添加一个包含我们想要访问的信息的属性。您可以根据需要添加任意数量的属性...

    partial class mysoapwebservice { public string myproperty{ get; set; } }

  • 在web.config中
  • 我们在项目上注册了soap扩展名globaly

    <webServices> <soapExtensionTypes> <add type="MySoapExtension" priority="1" group="Low"/> </soapExtensionTypes> </webServices>

  • 在代码中我们创建了Web服务对象&#39; mysoapwebservice&#39;我们设置了所需属性的值。

  • 在soapextension中,您可以获得对所调用的Web服务以及值的引用。您还可以确定方法调用。

`

public class MySoapExtension: SoapExtension 
{
  public override void ProcessMessage(SoapMessage message)
  {
    switch (message.Stage)
        {
            case SoapMessageStage.BeforeSerialize:
                {
                    // web service client object
                    var webserviceobject= ((SoapClientMessage)message).Client;
                    // method from web service that was called
                    var calledMethod = (SoapClientMessage)message).MethodInfo;

                    // checked the client type of webserviceobject and
                    //added method / property specific logic here
                 }
         }
  }

  // other soap extension code
}

答案 3 :(得分:-1)

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
public class CriptoExtensionAttribute : SoapExtensionAttribute

[CriptoExtension]
public partial class MainService{