私はsoapヘッダーをあまり扱ったことがないので、ここに答えがあることを望んでいます。これが私が達成しようとしていることの簡単な例です。
ASMX Webサービスとクライアント、および共有DLLがあります。shared.dllには、シリアル化可能なタイプがあります。SoapHeaderから派生したCustomHeaderと呼びましょう。これをSoapHeader属性を介した入力として受け入れるWebメソッドがあるため、私のサービスは次のようになります。
[WebService]
public class MyService : WebService {
public CustomHeader MyCustomHeader { get; set; }
[WebMethod]
[SoapHeader("MyCustomHeader", Direction = SoapHeaderDirection.In)]
public void Go() { }
}
ここまでは順調ですね。Go()メソッド内で、MyCustomHeaderオブジェクトにアクセスし、それを使用して処理を実行できます。クライアントからプロキシを生成すると、生成されたコードには、MyServiceオブジェクトのデータプロパティを含むCustomHeaderクラスと、Go()を呼び出す前にクライアントに設定できるCustomHeaderValueというプロパティが含まれます。それはうまく通過します。
問題は、元のCustomHeaderクラスに、データフィールド(ハッシュ関数、計算値など)の入力に役立つコンストラクターとメソッドが含まれていたことです。クライアントは共有ライブラリへの参照を持っているため、クライアントは元のCustomHeaderクラスのインスタンスを作成できますが、技術的に異なるタイプであるため、サービス呼び出しでそのオブジェクトを使用することはできません。
私はこれを処理するいくつかの方法を考えることができます:
1)一度に1つずつプロパティをプルして、CustomHeaderオブジェクトを生成されたCustomHeaderクラスに変換します。これはそれほど処理にはなりませんが、リフレクションを使用してプロパティをループするか、CustomHeaderクラスが変更されるたびに変換コードに触れる必要があることを意味します。
2)CustomHeaderオブジェクトをシリアル化し、生成されたCustomHeaderクラスに逆シリアル化します。コンストラクターとメソッドを除けば実際には同一であるため、シリアル化は問題なく機能するはずです。これが最も簡単な方法ですが、シリアル化/逆シリアル化の追加ラウンドが必要です。これは、それほど高価ではありませんが、それでも追加の処理です。
3)生成されたコードを変更して、生成されたタイプではなく、共有タイプのCustomHeaderValueプロパティを作成します。私の意見では、これは恐ろしいやり方ですが、おそらくこれらのオプションの中で最も安価な方法でしょう。私はこのオプションを実行するつもりはありませんが、技術的には機能するので、そこにそれを出したかっただけです。
私は何かが足りないのですか?これを行うための受け入れられたパターンはありますか?
助けてくれてありがとう。