返回JSON以与GET(JQuery ajax)一起使用的MVC服务。不行

时间:2013-05-30 09:51:48

标签: json wcf web-services jquery get

我有一个像这样的WCF Web服务(.svc):

Web服务

接口

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,但它只是给出了一个错误。我应该能够像浏览器一样在浏览器中进行测试(正如你所看到的那样我不会在输入中使用参数,所以不应该将它们传递进去):

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重新调回客户端,但我真的想要一种方法来回复像 Dave Ward这样的人物对象在这篇文章中说:http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/但我不能让它发挥作用。

我做错了什么?

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我终于找到了问题所在。

来自webservice的响应中有2个DateTime字段未设置。因此他们试图重新调整他们的MinValue。 但是我如何从这篇文章中学到:http://benpowell.org/wcf-json-serialization-error-with-datetime-minval-and-utc/ 那是行不通的。 所以我只是将DateTime字段设置为Nullable,现在一切都很完美。

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

希望这会帮助别人。