-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 重新调整回客户端的方式来回答这个问题,但我真的很想要一种方法来返回一个 Person 对象,就像Dave Ward在这篇文章中所说的那样:http:/ /encosia.com/asp-net-web-services-mistake-manual-json-serialization/但我无法让它工作。

我究竟做错了什么?

谢谢你的帮助。

4

2 回答 2

0

看起来添加包装器会强制您的数据以键值对的形式返回,而不仅仅是值。键值对是 JSON 正确读取它所需的格式。

于 2013-05-31T13:04:50.377 回答
0

我终于找到了问题所在。

来自 Web 服务的响应中有 2 个 DateTime 字段未设置。因此,他们试图返回他们的 MinValue。但是我是如何从这篇文章中学到的:http: //benpowell.org/wcf-json-serialization-error-with-datetime-minval-and-utc/ 这不起作用。所以我只是将 DateTime 字段设置为 Nullable,现在一切正常。

这是一个使用 GET 方法返回 Json 的 WCF 服务。

希望这对其他人有帮助。

于 2013-06-07T14:27:28.303 回答