我有一个接受SQL服务器查询的项目,将此查询传递给执行此查询的Web服务,将结果传递回客户端,然后返回DataSet
结果(以及一些额外的结果)属性)。目前,它使用WCF和SOAP进行通信。为了减少总请求时间,我试图将其转移到Web API和JSON。根据我的概念证明,这已经将总请求时间减少了大约30%,这对于这项服务的吞吐量来说非常重要。
我的问题是某些查询(我无法控制)从SQL Server中的图像列返回数据。 JSON.net数据表转换器非常乐意将其作为字节数组进行选择,base64对其进行编码。问题出现在客户端,同一个转换器只是选取此值并将其视为字符串,当我的项目的使用者期望它是一个字节数组时会导致问题。
我以为我可以在序列化程序上使用TypeNameHandling.All
选项,但数据表转换器不希望获得JsonToken.StartObject
类型的标记作为{{{1}的主体的一部分1}}。
鉴于我无法控制运行的查询,预期返回的数据类型以及无法控制它们的消耗方式,我能做些什么来成功传递字节数组作为一部分数据表与JSON.net?
答案 0 :(得分:0)
默认转换器的根本问题在于它试图纯粹基于数据来暗示数据类型。当时我没有意识到这个问题,但是我还需要确保在我按照服务器上的反序列化时获得完全相同的数据表。
所以我的解决方案是为DataSet
和DataTable
创建自己的转换器实现。它输出的JSON不如默认创建的那么漂亮,但是如果你传输的是超过1行的数据,它应该产生更紧凑的JSON。代码太大而无法在SO上发布,因此我将整个项目放在GitHub上。
答案 1 :(得分:0)
解决此问题的最简单方法是将此base64
编码的字符串转换为客户端中的byte []
。
string myPicture= dataRow["MY_PICTURE"].ToString();
myPicture= myPicture.Replace(" ", "+"); //Optional
byte[] myPictureInByte = Convert.FromBase64String(myPicture);
第二行是可选的。我得到base64
编码的字符串没有" +"在客户端反序列化时。所以我将它们添加回字符串并转换为byte []
。