1

パートナーの 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 を変更することはできません。

4

0 に答える 0