2

JQueryとAjaxを使用してASP.NetWebサービスとインターフェイスしています。Jqueryコードは次のとおりです。

$.jrpc = function(url, id, method, params, success, error) {
    var request = $.json_stringify({
       'jsonrpc': '2.0', 'method': method,
        'params': params, 'id': id});
    return $.ajax({
        url: url,
        data: "json=" + encodeURIComponent(request),
        success: success,
        error: error,
        contentType: 'application/json; charset=utf-8',
        dataType: 'json',
        async: true,
        cache: false,
        //timeout: 1,
        type: 'POST'});
};

Webサービスコードは次のとおりです。

[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class Access : System.Web.Services.WebService
{

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public string EntryMethod(string json)
    {
        Requests d = JsonConvert.DeserializeObject<Requests>(json);
        Response resp = new Response();
        resp.jsonrpc = d.jsonrpc;
        resp.result = "Got the call!";
        resp.id = d.id;
        resp.error = null;
        JavaScriptSerializer response = new JavaScriptSerializer();
        string r = response.Serialize(resp);

        return r;
    }
}

このエラーが発生します:

[AJAX]エラー-サーバーの応答は次のとおりです:{"メッセージ": "無効なJSONプリミティブ:json。"、 "StackTrace": "at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\ r \ n at System.Web .Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32depth)\ r \ n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input、Int32depthLimit、JavaScriptSerializer serializer)\ r \ n at System.Web.Script.Serialization .JavaScriptSerializer.Deserialize(JavaScriptSerializerシリアライザー、文字列入力、タイプタイプ、Int32depthLimit)\ r \ n(System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](文字列入力)\ r \ n、System.Web.Script) .Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context、JavaScriptSerializerシリアライザー)\ r \ nSystem.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData、HttpContext context)\ r \ n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context、WebServiceMethodData methodData) " 、"ExceptionType": "System.ArgumentException"}

ASP.Net Webサービスのテストページを使用して、ヘッダーと要求文字列を次に示します。Cache-Control:private、max-age = 0 Date:Wed、03 Oct 2012 19:47:16 GMT Content-Length:149 Content-Type: text / xml; charset = utf-8サーバー:ASP.NET開発サーバー/10.0.0.0 X-AspNet-バージョン:4.0.30319接続:閉じる

json =%7B%22jsonrpc%22%3A%222.0%22%2C%22method%22%3A%22test%22%2C%22params%22%3A%5B%5D%2C%22id%22%3A1%7D

そして、これが機能していない私のAjax呼び出しのヘッダー/リクエスト文字列です:Cache-Control:private Date:Wed、03 Oct 2012 19:47:09 GMT Content-Length:1062 Content-Type:application / json; charset = utf-8 jsonerror:trueサーバー:ASP.NET開発サーバー/10.0.0.0 X-AspNet-バージョン:4.0.30319接続:閉じる

json =%7B%22jsonrpc%22%3A%222.0%22%2C%22method%22%3A%22test%22%2C%22params%22%3A%5B%5D%2C%22id%22%3A1%7D

なぜこのエラーが発生するのかについてのアイデアはありますか?私はそれをグーグルで検索しようとしましたが、結果のどれも私を本当に助けませんでした。

編集:

使用する場合:data: "{'jsonrpc': '2.0'、'method':'test'、'params':[]、'id':1}"、

このエラーが発生します:[AJAX]エラー-サーバーの応答は次のとおりです:{"メッセージ": "無効なWebサービス呼び出し、パラメーターの値がありません:\ u0027json \ u0027。"、 "StackTrace": "at System.Web.Script.Services .WebServiceMethodData.CallMethod(Object target、IDictionary 2 parameters)\r\n at System.Web.Script.Services.WebServiceMethodData.CallMethodFromRawParams(Object target, IDictionary2 parameters)\ r \ n at System.Web.Script.Services.RestHandler.InvokeMethod(HttpContext context、WebServiceMethodData methodData、IDictionary`2 rawParams)\ r \ n at System.Web.Script .Services.RestHandler.ExecuteWebServiceCall(HttpContext context、WebServiceMethodData methodData) "、" ExceptionType ":" System.InvalidOperationException "}

使用する場合:data: "json = {'jsonrpc': '2.0'、'method':'test'、'params':[]、'id':1}"、

このエラーが発生します:[AJAX]エラー-サーバーの応答は次のとおりです:{"メッセージ": "無効なJSONプリミティブ:json。"、 "StackTrace": "at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializePrimitiveObject()\ r \ n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32depth)\ r \ n at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input、Int32depthLimit、JavaScriptSerializer serializer)\ r \ natSystem。 Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer、String input、Type type、Int32depthLimit)\ r \ n at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize [T](String input)\ r \ n at System.Web.Script.Services.RestHandler.GetRawParamsFromPostRequest(HttpContext context、JavaScriptSerializerシリアライザー)\ r \ nSystem.Web.Script.Services.RestHandler.GetRawParams(WebServiceMethodData methodData、HttpContext context)\ r \ n at System.Web.Script.Services.RestHandler.ExecuteWebServiceCall(HttpContext context、WebServiceMethodData methodData) " 、"ExceptionType": "System.ArgumentException"}

4

2 に答える 2

3

データを変更: "json =" + encodeURIComponent(request)、to
data: "{json:'" + encodeURIComponent(request)+ "'}"、

サンプルコードを参照してください

  $.ajax("WebService.asmx/EntryMethod", {
        contentType: "application/json; charset=utf-8",dataType: "json",
        type: "POST", data: "{json:'value'}", success: function (r) { alert(r); },
        error: function (e) { alert(e); }
    });
于 2012-10-03T20:51:33.800 に答える
2

データプロパティから「json=」を削除し、encodeURIComponent(request)がjsonオブジェクトであることを確認してください。これは、そうではないと推測しています。

于 2012-10-03T20:10:06.150 に答える