パートナーの Soap Web サービスの呼び出しに問題があります。このサービスと連携するには、C# でクライアントを作成する必要があります。私はウェブサービスに比較的慣れていないので、質問が些細なことで申し訳ありませんが、何時間もグーグルで検索した後、答えが見つかりません。
そのため、(php で記述された) サービスは、キーと値のペアのパラメーターを受け入れます。この構造 (フィールド名、型) はマニュアルに記載されていますが、wsdl には表示されません (wsdl には型定義はありません)。
WSDL の一部:
<message name="Authenticate">
<part name="auth" type="xsd:anyType"/>
</message>
(例えば、「auth」は上記の配列型で、これは入力パラメータです)
したがって、これらのパラメータは wsdl では「anyType」として表示されます。プロキシ クラスを ([Web 参照の追加] オプションを使用して) 生成したとき、これらのパラメーターが自動生成されたクラスで "オブジェクト" として表示されることに気付きました。
渡ってみた
- HashTable、Dictionary: これらはシリアル化できません。
- 配列: キーと値のペアではありません。2 次元配列は受け入れられません。1 次元では不十分です (とにかく機能しません)。
- カスタムクラス:これが答えになると思いますが、シリアル化の問題があります。
私のカスタムクラスは次のとおりです。
[Serializable]
public class AuthClass
{
public string Username { get; set; }
public string AuthCode { get; set; }
}
そこで、「Authclass」のインスタンスを作成し、それを埋めて、サービスに渡そうとしました。
Authclass a = new AuthClass();
(...fill....)
MyService s = new MyService(); //auto-generated proxy class
s.Authenticate(a); //auto-generated method
実行時に、シリアライゼーション エラー メッセージが表示されました。HelloWsdl.AuthClass の型は想定されていませんでした。XmlInclude または SoapInclude 属性を使用して、静的に認識されていない型を指定します。
AuthClass、SoapInclude、XMLInclude、XmlRoot などのシリアル化属性を非常に多く試しました。また、オブジェクト配列、List などを使用して「オブジェクト」にキャストしようとしましたが、これらのどれも問題を解決しませんでした。
だから私の質問は
- このWebサービスに「phpスタイル」の配列パラメータを渡すにはどうすればよいですか? 正しい方法はどれですか?
- この状況で生成されたプロキシ クラスを使用することは可能ですか、それとも別の手法を選択する必要がありますか? この場合、どのテクニックが推奨されますか?
残念ながら、wsdl を変更することはできません。