1

我正在使用 WCF 返回一个 JSON,webHttpBinding以便可以将 JQuery 用于某些网格。今天,我正在查询数据库,并得到一个回复​​,并使用 Linq,用我需要的字段DataTable填充一个,然后我使用它序列化它,以便我可以将它作为字符串返回给客户端。下面是实现的片段:List<DTO>SerializeObject

public string GetJSON(int pSkip, int pTake, int pCount)
{
  DataTable dtResult = WUOnSiteMotivoRejeicaoBus.ObterRejeicoes(pSkip, pTake, pCount);
  List<WUOsMotivoRejeicaoDTO> lsResult = dtResult.AsEnumerable()
    .Select(row => new ClsResultDTO
      {
        Result1 = Convert.ToInt32(row["cd_result1"]),
        Result2 = Convert.ToString(row["dc_result2"]),
      })
    .ToList();
  return JsonConvert.SerializeObject(lsResult, Formatting.None);
}

在接口方面,以下是配置:

[OperationContract]
[WebGet(BodyStyle = WebMessageBodyStyle.Wrapped,
      ResponseFormat = WebMessageFormat.Json,
      UriTemplate = "GetJson?skip={pSkip}&take={pTake}&count={pCount}")]
string GetJSON(int pSkip, int pTake, int pCount);

返回的是一个需要解析的 JSON 字符串,使用 parseJSON

   var obj = $.parseJSON(retorno);

这是返回 JScript 客户端使用的 JSON 结果的最佳/正确方法吗?有没有办法返回字符串以外的东西,并避免解析?

编辑

在客户端,我使用的是 MVC3,而不是 ASP.NET Web 窗体。Tks

4

1 回答 1

2

不,你犯了一个常见的错误。拿这个帖子看看

http://encosia.com/asp-net-web-services-mistake-manual-json-serialization/

永远不要那样做:)

编辑

需要多放一些。关键是:你永远不应该在 web 方法中序列化数据,因为 WCF 基础设施会为你做这件事。如果您自己进行序列化,WCF 中有类似“停止将我的数据序列化为 JSON”的配置,因此您返回的字符串将被序列化两次。

因此,您将在客户端上执行双重评估(或 parseJSON)。

当您只返回一个对象时,其余工作将由 WCF 完成。在客户端,如果您使用 jQuery,它会自行评估返回值,并将准备好使用的 javascript 对象传递给“成功”回调(无需进一步解析)。

于 2011-07-07T16:58:21.893 回答