まずはシナリオを共有したいと思います。
シナリオ: wpfを使用してクライアントアプリケーションを構築しています。場合によっては、サーバーからデータを取得するためにWebサービスを呼び出す必要があります。これを行うために、wsld urlを使用してWeb参照を追加しました。サービスメソッドを呼び出すServiceManagerクラスを作成しました。セキュリティ上の理由から、soap xml request、UserToken、SAML Tokenなどのヘッダー情報を追加する必要があります。私はServiceManagerクラスからこれを行うことができます。しかし、私はサーバーにリクエストを送信する前に呼び出される別のクラスを追加したいと思います。そのクラスでは、soap xml requestにセキュリティヘッダーを追加してサーバーに送信するような作業を行います。C#でSOAPサービスを呼び出すときに、サービスマネージャクラスの委譲クラスを追加する方法は?
私の目的を達成するためにSOAP Extensionを使用しましたが、うまく機能します。しかし問題は、毎回、サービスメソッドの先頭にReference.cs(各Webサービス参照用)ファイルに注釈を追加する必要があることです。これをSOAP拡張よりもうまく機能させるための他の最も簡単な方法があると私は信じています。私はサービスを呼び出すことができ、代理クラスが自動的に呼び出される方法はありますか?また、参照ファイルに注釈を追加する必要はありませんか?サンプルコードをここで共有します。
ServiceManageクラス:
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]));
}
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}
}