我有一个像这样的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,但它只是给出了一个错误。我应该能够像浏览器一样在浏览器中进行测试(正如你所看到的那样我不会在输入中使用参数,所以不应该将它们传递进去):
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/但我不能让它发挥作用。
我做错了什么?
感谢您的帮助。
答案 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服务。
希望这会帮助别人。