-2

次のような WCF Web サービス (.svc) があります。

ウェブサービス

インターフェース

namespace Interfaces
{
    [ServiceContract]
    public interface IGeneral
    {
    [OperationContract]
    [WebInvoke(Method = "GET", BodyStyle = WebMessageBodyStyle.WrappedRequest,
                         ResponseFormat = WebMessageFormat.Json)]
    List<Person> GetPerson(long personID, DateTime startDate);
    }
}

クラス

[ScriptService]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class GeneralService : Interfaces.IGeneral
{
    [ScriptMethod(ResponseFormat = ResponseFormat.Json, UseHttpGet = true)]
    [WebMethod]
    public List<Person> GetPerson(long personID, DateTime startDate)
    {
        List<Person> people= new List<Person>();
        people.Add(new Person()
        {
            PersonID= 2,
            StartDate= new DateTime(),
        });
        return people;
    }
}

namespace Models
{
    [DataContract]
    public class Person
    {
        [DataMember]
        public long PersonID{ get; set; }
        [DataMember]
        public DateTime StartDate{ get; set; }

    }
}

これがJsonで戻ってくることを期待していますが、エラーが発生するだけです。これをブラウザーから GET としてテストできるはずです (ご覧のとおり、入力でパラメーターを使用していないため、パラメーターを渡さなくても問題ありません)。

http://localhost:2880/GeneralService/GetPerson

私がそれを呼ぶ方法はこれです:

クライアントコール

var request = {
    personID: 3,
    startDate: new Date(),
 };

ajaxService = (function () {
    var ajaxGetJson = function (method, request, callback, service) {
        $.ajax({
            url: getSvcUrl(service, method),
            type: "GET",
            data: request,
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (result, statusMsg, status)
            {
                callback(result, statusMsg, status, request)
            },
            error: ServiceFailed // When Service call fails
        })
    }
    return {
        ajaxGetJson: ajaxGetJson,
    };
})();

ajaxService.ajaxGetJson("GetPerson", request, ModelMetricsMapper, "http://localhost:2880/GeneralService/");

アップデート

もう少し情報があります。返すクラスを変更するとうまくいくようです。私は説明します:私のクラスがプリミティブを内部に持つ単純なクラスである場合は機能しませんが、各プリミティブの周りにラッパークラスを追加すると...突然機能します。応答クラスは、少なくとも 2 レベルのネストが必要なようです。

動作する新しいクラスは次のとおりです。

作品

[DataContract] 
public class Person { 
    [DataMember] 
    public IdClass PersonID{ get; set; } 
    [DataMember] 
    public DateClass StartDate{ get; set; } 
} 

なぜ?

javascriptSerializer.Serializeを使用してStrem をクライアントに戻す方法でこの質問に答えます。 /encosia.com/asp-net-web-services-mistake-manual-json-serialization/しかし、私はそれを機能させることができません。

私は何を間違っていますか?

助けてくれてありがとう。

4

2 に答える 2

0

ラッパーを追加すると、データが単なる値ではなく、キーと値のペアとして強制的に返されるようです。キーと値のペアは、JSON が正しく読み取るために必要な形式です。

于 2013-05-31T13:04:50.377 に答える