6

C#WebサービスからJsonデータを取得する必要があります。

私はこれに基づいていくつかの質問があることを知っています、私がかなりの数を読んだことを信じてください、しかし私をさらに混乱させるだけです。

これは私がしたことです:

私のWebサービスには[System.Web.Script.Services.ScriptService]、クラスと[ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]メソッドに次のものが含まれています。

JavaScriptSerializer()また、データを文字列に変換するためにを使用しました

私はこのサービスを使用して呼んでいます$.getJSON()

これを使用しないと、クロスドメイン参照エラーが発生します。

これを行うには、コールバック関数名を取得するようにmサービスを設定する必要があったため、t his.Context.Request["callback"]+シリアル化されたJsonデータを渡します。

しかし、出力ではそれをラップします

< string xmlns="http://XYZ...">  

タグ内のデータは必要な形式です

また、次を使用してコンテンツタイプを設定してみました:$.ajaxSetup({ scriptCharset: "utf-8" , contentType: "application/json; charset=utf-8"});

しかし、それでも成功しません。

後で追加:フレンチブルドッグの回答を受け入れました。これは正しいアプローチであることがわかっているのですが、うまく機能しません... WebサービスとWebサイトを同じドメインに配置し、xmlを使用しただけですが、これが最善の方法ではなかったことを知っています。しかし、私はそれに2日間を費やし、それ以上無駄にする余裕はありませんでした。

4

1 に答える 1

4

これを使って:

var JsonString = ....;
$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: "YourWebServiceName.asmx/yourmethodname",
    data: "{'TheData':'" + JsonString + "'}",
    dataType: "json",
    success: function (msg) {
        var data = msg.hasOwnProperty("d") ? msg.d : msg;
        OnSucessCallBack(data);
    },
    error: function (xhr, status, error) {
        alert(xhr.statusText);
    }
});

function OnSuccessCallData(DataFromServer) {
 // your handler for success    
}

次に、サーバー側で、AppCode フォルダーに自動生成されるコード ビハインド ファイルに、次のように記述します。

using System.Web.Services;
using System.Web.Script.Serialization;

    [System.Web.Script.Services.ScriptService]
    public class YourWebServiceName : System.Web.Services.WebService
    {
        [WebMethod]
        public string yourmethodname(string TheData)
        {
          JavascriptSerializer YourSerializer = new JavascriptSerializer();
          // custom serializer if you need one 
          YourSerializer.RegisterConverters(new JavascriptConverter  [] { new YourCustomConverter() });

          //deserialization
          TheData.Deserialize(TheData);

          //serialization  
          TheData.Serialize(TheData);
        }
    }

カスタム コンバーターを使用しない場合、逆シリアル化が機能するには、json 文字列とサーバー側オブジェクトの c# クラス定義の間のプロパティが一致する必要があります。シリアル化の場合、カスタム コンバーターがない場合、json 文字列には c# クラスのすべてのプロパティが含まれます。[ScriptIgnore]C# クラスのプロパティ定義の直前に追加できます。カスタム コンバーターを指定しない場合、そのプロパティはシリアライザーによって無視されます。

于 2011-12-06T19:27:43.417 に答える