【问题标题】:How to add SoapExtension attribute to generated web service client proxy without modifying the generated class?如何在不修改生成的类的情况下将 SoapExtension 属性添加到生成的 Web 服务客户端代理?
【发布时间】:2010-10-13 00:49:43
【问题描述】:

我创建了一个 SoapExtension 类来捕获来自特定 Web 服务调用的肥皂请求和响应。为了使这个 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]));
    }

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

谢谢!

【问题讨论】:

标签: c# web-services soap proxy wsdl


【解决方案1】:

很遗憾,您需要修改代理代码。您提到的其他可能性将不起作用-parial 类不会覆盖现有功能,而且我没有办法知道获得一个接口来做您需要的事情(再加上没有办法让代理生成器知道您打算实现一个接口)。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是 6 年前发布的......所以目前不确定这是否会对任何人有所帮助。

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

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

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

      • 在 web.config 中,我们在项目中全局注册了 soap 扩展

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

      • 在代码中,我们创建了 Web 服务对象“mysoapwebservice”,我们设置了所需属性的值。

      • 在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
      }
      

      【讨论】:

        【解决方案4】:
        [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)]
        public class CriptoExtensionAttribute : SoapExtensionAttribute
        
        [CriptoExtension]
        public partial class MainService{
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-09-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-07
          • 2010-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多