在c#中调用soap服务时,如何为服务管理器类添加委托类?

在c#中调用soap服务时,如何为服务管理器类添加委托类?,c#,.net,soap,delegates,soap-extension,C#,.net,Soap,Delegates,Soap Extension,首先,我想分享我想要构建的场景- 场景: 我正在使用wpf构建一个客户端应用程序。在某些情况下,我需要调用web服务从服务器获取数据。为了做到这一点,我使用wsld url添加了一个web引用。我创建了一个ServiceManager类,它将调用服务方法。出于安全原因,我需要在soapxml请求中添加一些头信息,例如UserToken、SAML Token等等。我可以从我的ServiceManager类中获取此信息。但是我想添加另一个类,它将在向服务器发送请求之前被调用。在该类中,我将使用req

首先,我想分享我想要构建的场景-
场景: 我正在使用wpf构建一个客户端应用程序。在某些情况下,我需要调用web服务从服务器获取数据。为了做到这一点,我使用wsld url添加了一个web引用。我创建了一个ServiceManager类,它将调用服务方法。出于安全原因,我需要在soapxml请求中添加一些头信息,例如UserToken、SAML Token等等。我可以从我的ServiceManager类中获取此信息。但是我想添加另一个类,它将在向服务器发送请求之前被调用。在该类中,我将使用request向soapxml请求添加安全头,然后将其发送到服务器

我使用SOAP扩展来实现我的目的,它工作得很好。但问题是,每次我需要在Reference.cs(针对每个web服务引用)文件的服务方法顶部添加注释时。我相信还有其他一些最简单的方法可以使它比SOAP扩展更好地工作。有没有什么方法可以让我只调用服务,然后自动调用委托类,而不需要向引用文件添加任何注释?我将在这里分享我的示例代码

服务管理类:

public class ServiceManager
{ 
public UserDataService dataService; //web service added at Web Reference
public ServiceManager()
{
dataService = new UserDataService();
getUserServiceRequest rqst = new getUserServiceRequest();
getUserServiceResponse resp = dataService.getUser(rqst);
}
}
Reference.cs

[TraceExtensionAttribute(Name = "First")]
public getUserServiceResponse getUser([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] getUserServiceRequest request) {
object[] results = this.Invoke("getUser", new object[] {
                  request});
return ((getUserServiceResponse)(results[0]));
}
[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute
{
     private string mstrName = null;
     public override Type ExtensionType
     {
         get { return typeof(TraceExtension); }
     }
     public override int Priority
     {
        get { return 1; }
         set { }
     }
     public string Name
     {
         get { return mstrName; }
         set { mstrName = value; }
      }
}
 public class TraceExtension : SoapExtension
{
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attr){//..do something}
    public override void Initialize(object initializer){//..do something}
    public override Stream ChainStream(Stream stream){//...do something}
    public override void ProcessMessage(SoapMessage message) {//..do something}
}
TraceExtensionAttribute.cs

[TraceExtensionAttribute(Name = "First")]
public getUserServiceResponse getUser([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] getUserServiceRequest request) {
object[] results = this.Invoke("getUser", new object[] {
                  request});
return ((getUserServiceResponse)(results[0]));
}
[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute
{
     private string mstrName = null;
     public override Type ExtensionType
     {
         get { return typeof(TraceExtension); }
     }
     public override int Priority
     {
        get { return 1; }
         set { }
     }
     public string Name
     {
         get { return mstrName; }
         set { mstrName = value; }
      }
}
 public class TraceExtension : SoapExtension
{
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attr){//..do something}
    public override void Initialize(object initializer){//..do something}
    public override Stream ChainStream(Stream stream){//...do something}
    public override void ProcessMessage(SoapMessage message) {//..do something}
}
TraceExtension.cs

[TraceExtensionAttribute(Name = "First")]
public getUserServiceResponse getUser([System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)] getUserServiceRequest request) {
object[] results = this.Invoke("getUser", new object[] {
                  request});
return ((getUserServiceResponse)(results[0]));
}
[AttributeUsage(AttributeTargets.Method)]
public class TraceExtensionAttribute : SoapExtensionAttribute
{
     private string mstrName = null;
     public override Type ExtensionType
     {
         get { return typeof(TraceExtension); }
     }
     public override int Priority
     {
        get { return 1; }
         set { }
     }
     public string Name
     {
         get { return mstrName; }
         set { mstrName = value; }
      }
}
 public class TraceExtension : SoapExtension
{
    public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attr){//..do something}
    public override void Initialize(object initializer){//..do something}
    public override Stream ChainStream(Stream stream){//...do something}
    public override void ProcessMessage(SoapMessage message) {//..do something}
}

最后,我找到了解决办法。只需完成Web引用并添加服务引用即可。那就去。它对我有用

最后,我找到了解决办法。只需完成Web引用并添加服务引用即可。那就去。它对我有用