1

Web サービスの呼び出しが失敗するのはなぜですか? ボタンをクリックすると、jquery を使用して asp.net ページから Web サービスが呼び出されます。Web サービスは JSON 文字列を返します: {"Message":"Hello World"}. 現時点では、返されたメッセージに対して何もしようとはしていません。エラー関数を通過せずに Web サービスを呼び出そうとしているだけです。コードについては、以下を参照してください。

The Web service:  

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Script.Serialization;
using System.Web.Script.Services;
using System.Runtime.Serialization.Json;

namespace EForm.Services
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]    
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class PeopleWebService : System.Web.Services.WebService
    {
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public void HelloWorld()
        {
            JavaScriptSerializer js = new JavaScriptSerializer();
            var jsonData = new
            {
                Message = "Hello World"
            };
            string retJSON = js.Serialize(jsonData);
            Context.Response.Write(retJSON);
        }
    }
}

The asp.net page:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script src="Scripts/jquery-1.7-vsdoc.js" type="text/javascript"></script>
<script src="Scripts/jquery-1.7.js" type="text/javascript"></script>
<script type="text/javascript">
    function getUserName() {
        $.ajax({
            url: "http://localhost:1211/Services/PeopleWebService.asmx/HelloWorld",
            cache: false, // don't cache results
            type: "POST",
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            data: "{}",
            success: function () {
                alert("worked");
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert("Status: " + xhr.status);
                alert("Response Text: " + xhr.responseText);
                alert("Thrown Error: " + thrownError);
            }
        });
        return false;
    }
    $(document).ready(function () {
        $("#Search").click(getUserName);
    });
</script>

</head>
<body>
    <form id="form1" runat="server">
    <asp:Button ID="Search" runat="server" Text="Search" />
    </form>
</body>
</html>

The Return Errors
FireFox 24.0
    Status: 0
    Response Text:
    Thrown Error:

Opera 17.0
    Status: 0
    Response Text:
    Thrown Error:

Chrome 30.0.1599.69 m
    Status: 0
    Response Text:
    Thrown Error:

IE 10
    Status: 200
    Response Text: {"Message":"Hello World"}{"d":null}
    Thrown Error:  SyntaxError: Syntax error
4

2 に答える 2

1

実際には必要以上のことを行っています。ASP.NET サービス モデルは、応答自体を完全にシリアル化できます。応答ストリームに手動で書き込むことにより、本質的に応答ストリームに「2 倍浸す」ことになります。まず、独自の JSON データを記述しました{"Message":"Hello World"}が、パイプラインは独自の null JSON シリアル化オブジェクトも追加しています{"d":null}(メソッドが void/null を返すため)。

その後、ブラウザは無効な JSON: を受け取ります。{"Message":"Hello World"}{"d":null}これは、ブラウザの実装に応じてさまざまな方法で応答します (ご覧のとおり)。

代わりに、ASP.NET にシリアル化を処理させてください。

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public dynamic HelloWorld()
{
    return new
    {
        Message = "Hello World"
    };
}

の(有効な)応答が得られます{"d":{"Message":"Hello World"}}

于 2013-10-17T21:35:05.297 に答える
0

メソッドにデータを書き込む代わりに、データを返すようにしてくださいResponse:

    [WebMethod]
    public string HelloWorld()
    {
        JavaScriptSerializer js = new JavaScriptSerializer();
        var jsonData = new
        {
            Message = "Hello World"
        };
        return js.Serialize(jsonData);            
    }
于 2013-10-17T18:42:27.733 に答える