首先,我想分享我想要构建的场景 -
场景:
我正在使用 wpf 构建客户端应用程序。在某些情况下,我需要调用 Web 服务来从服务器获取数据。为了做到这一点,我使用 wsld url 添加了一个 Web 引用。我创建了一个调用服务方法的 ServiceManager 类。出于安全原因,我需要在soap xml 请求中添加一些标头信息,例如,UserToken、SAML Token 等。我可以从我的 ServiceManager 课程中做到这一点。但是我想添加另一个在向服务器发送请求之前将被调用的类。在该类中,我将执行一些操作,例如将安全标头添加到带有请求的soap xml 请求中,然后将其发送到服务器。
我使用 SOAP Extension 来实现我的目的,它运行良好。但问题是,每次我需要在服务方法顶部的 Reference.cs(对于每个 Web 服务引用)文件中添加注释。我相信还有一些其他最简单的方法可以使它比 SOAP Extension 更好地工作。有什么方法我只能调用服务并且会自动调用委托类并且我不需要向参考文件添加任何注释?我将在这里分享我的示例代码。
服务管理类:
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);
}
}
参考.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]));
}
TraceExtensionAttribute.cs
[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; }
}
}
TraceExtension.cs
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}
}