1

我有一个项目接受 SQL 服务器查询,将此查询传递给执行此查询的 Web 服务,将结果传递回客户端,然后返回DataSet结果(以及一些其他属性)。目前它使用 WCF 和 SOAP 进行通信。为了减少总请求时间,我试图将其移至 Web API 和 JSON。根据我的概念证明,这将总请求时间减少了大约 30%,考虑到该服务的吞吐量,这非常重要。

我的问题是某些查询(我无法控制)从 SQL Server 中的图像列返回数据。JSON.net 数据表转换器非常乐意将其作为字节数组提取并进行 base64 编码。问题发生在客户端,其中同一个转换器只是获取此值并将其视为字符串,当我的项目的使用者期望它是字节数组时会导致问题。

我以为我可以使用TypeNameHandling.All序列化程序上的选项,但数据表转换器不希望将类型标记JsonToken.StartObject作为DataTable.

鉴于我无法控制正在运行的查询、预期返回的数据类型以及无法控制它们的使用方式,我能做些什么来成功地将字节数组作为数据表的一部分传递JSON.net?

4

2 回答 2

0

默认转换器的潜在问题是它试图暗示纯粹基于数据的数据类型。当我问这个问题时我没有意识到,但我还需要确保在反序列化时可以获得与服务器上完全相同的数据表。

DataSet所以我的解决方案是为和创建我自己的转换器实现DataTable。它输出的 JSON 不像默认创建的那样漂亮,但如果您传输超过 1 行数据,它应该会生成更紧凑的 JSON。代码太大,无法在 SO 上有意义地发布,所以我将整个项目放在了GitHub 上

于 2013-10-15T03:58:01.507 回答
0

解决这个问题的最简单方法是将此base64编码字符串转换为byte []客户端。

string myPicture= dataRow["MY_PICTURE"].ToString();
myPicture= myPicture.Replace(" ", "+"); //Optional
byte[] myPictureInByte = Convert.FromBase64String(myPicture);

第二行是可选的。在客户端反序列化时,我得到了base64没有“+”的编码字符串。所以我将它们添加回字符串并转换为byte [].

于 2015-10-12T04:31:11.993 回答