-1

PHPWebサービスを利用しています。VisualStudioで[Webサービス参照の追加]を使用してWSDLを生成しました。

getOurRequest Serviceメソッドは、「オブジェクト」タイプの入力パラメーターを想定しています。

このメソッドのPHPドキュメントには、PHPで宣言された次の配列があります。

$getOurRequest =>array( 
    `aaaa`=> ‘1111’,
    `bbbb`=> ‘2222’,
    `ccccArray`=> array(
            ‘cccc3333’
                ,‘cccc4444‘
),
    `ddddArray`=>array(
            'dddd5555'
            ,'dddd6666'
            )
);

PHP Webサービスを呼び出すために使用するためにC#に変換するにはどうすればよいですか?

Webサービスに渡すのが好ましいソリューションまたは一般的なシリアル化可能な構造を支援するためのアイデアをいただければ幸いです。

@quetzalcoatl var c#宣言のサンプルをありがとうございます。役に立ちましたが、サービスコールではシリアル化されません。

4

2 に答える 2

1

あなたの質問に直接答えると、C#で可能な最も近い構造は、Dictionaryというよりも、Dictionary<string, object>

$getOurRequest => array( 
  `aaaa`=> ‘1111’,
  `bbbb`=> ‘2222’,
  `ccccArray`=> array( ‘cccc3333’, ‘cccc4444‘ ),
  `ddddArray`=>array( 'dddd5555','dddd6666' )
);

私は実際に表記法を理解していません$getOurRequest => array(...);。ここで=>の代わりに=プレーンであるべきではありませんか?

いずれにせよ、C#では類似の変数宣言は次のようになります。

var getOurRequest = new Dictionary<string, object>
{ 
  {"aaaa", "1111"},
  {"bbbb", "2222"},
  {"ccccArray", new string[] { "cccc3333", "cccc4444" } },
  {"ddddArray", new string[] { "dddd5555", "dddd6666" } }
);

ただし、それではHTTPリクエストの送信に関する問題は解決しないと思います。このためにはHttpWebRequest、Jensenが答えたように、オブジェクトが必要になります。また、上記のハッシュマップ/配列/辞書のすべての「キー」と「値」をクエリパラメータとして指定する必要があります。

@SOAP:のWSDLを発行できる場合web service、VisualStudio / C#/ svcutilは、Webサービスの呼び出しを非常に簡素化する一連のプロキシクラスを生成できます。可能であれば、メモをドロップしてください。その方法へのリンクが表示されます。または、「C#callwebservice」でGoogleを検索してください。

好奇心から-C#を知らず、PHPをよく知っているのなら、なぜC#コードを要求するのですか?

編集:
コメントでは、「オブジェクトパラメータ」について述べています。PHPまたはJSでは、オブジェクトとキー付き配列の間に少し違いがあります。C#では、「辞書」またはその他のハッシュマップが「一連のキーと値」としてシリアル化されるため、大きな違いがあります。フィールド/値を持つキーを持つオブジェクトとしてではなく、「オブジェクト」、実際にはクラスとオブジェクトインスタンスが必要です。

//[DataContract] - pick one of them
//[Serializable] - they are required, but without seeing your code, it is hard to tell which one
public class MyWebServiceParameter
{
    public string aaaa {get;set;} // those must be properties, not fields
    public string bbbb {get;set;}
    public string[] ccccArray {get;set;}
    public string[] ddddArray {get;set;}
}

....
var tmp = new MyWebServiceParameter
{
     aaaa = "1111", bbbb = "2222",
     ccccArray = new string[] { "....", "...." },
     ddddArray = new string[] { "....", "...." }
};

「属性」の1つであるdatacontract/serializableのコメントを解除してください。どちらもC#ランタイムに、このクラスのシリアル化が許可されていることを伝えていますが、それぞれが異なるライブラリからのものであり、.Netのネットワークアプローチの時代のものです。一般に、それぞれは問題ありませんが、WSDLから生成された方法/内容、および使用している.Netと追加のライブラリに応じて1つが適切になります。'最新の'.Netを使用している場合は、DataContractを選択します。

今、あなたはあなたがWSDLを持っていると言いますか?したがって、プロジェクトを右クリックして[サービス参照の追加]または[Web参照の追加]を選択し、ポップアップダイアログでWSDLへのURLを入力します。作成者はそれを解析できる必要があり、そのWebサービスの一連のサポートクラスが生成されます。それらが「MyPHPService」と呼ばれ、「TheServiceMethodName」と呼ばれる操作を定義するとします。

var serv = new MyPHPService();
serv.TheServiceMethodName( tmp ); // just pass the object you have created earlier. Or a dictionary, or other..

WSDLに問題がなく、作成者がそれを正しく理解している場合、SOAPサービスの呼び出しには、これら2行のみが必要です。

于 2012-08-21T18:54:31.810 に答える
0

PHPサービスをどのように呼んでいるのかわからないので、私の答えは個人的なプロジェクトに基づいています。

私が通信していた言語はC#だけではなく、物事をシンプルに保ちたかったので、SOAPサービスを作成することに興味はありませんでした。を使用しHttpWebRequestてWebサーバーを呼び出し、ページ出力を分析するだけです。

そこで、JSONを使用しました。Json.NETと呼ばれるJamesNewton -Kingの強力なライブラリがあります。オブジェクトをJSONとの間で変換できます。

PHP側では、これらの関数はPHPインタープリターに組み込まれています:json_encodeおよびjson_decode

于 2012-08-21T18:44:18.170 に答える