这个思路是从 一篇文章,关于《提升web api的性能》上看到的。自己实践了一番,写下步骤。

传统的DataReader是遵循这样的一个步骤:

While(reader.Read())

{

//创建对象,赋值,添加到集合

}

//返回Json.序列化(集合)

现在我们采用的是手工拼接Json字符串:通过解析DataReader的数据格式、内容,采用StringBuilder.Append这种方式进行手工拼接。

避免了每次初始化对象、序列化集合所带来的内存、时间上的消耗。在查询数据量很大集合时,很有帮助。

代码很简单,就不多做解释了

using System;
using System.Data.SqlClient;
using System.Text; namespace DataProvider.Common
{
public class Tools
{
/// <summary>
/// 将Reader集合转换成字符串
/// </summary>
/// <param name="reader"></param>
/// <returns></returns>
public static string ConvertReadersToJson(SqlDataReader reader)
{
var jsonStr = new StringBuilder();
jsonStr.Append("["); while (reader.Read())
{
ConvertSingleReaderToJson(reader, jsonStr);
jsonStr.Append(",");
} if (jsonStr.Length > )
{
jsonStr.Length = jsonStr.Length - ;
jsonStr.Append("]");
return jsonStr.ToString();
} return string.Empty;
} /// <summary>
/// 将一个Reader转换成Json字符串,reader必须可读.read
/// </summary>
/// <param name="reader"></param>
/// <param name="jsonStr"></param>
public static void ConvertSingleReaderToJson(SqlDataReader reader, StringBuilder jsonStr)
{
jsonStr.Append("{"); for (var i = ; i < reader.FieldCount; i++)
{
//值类型数据不需要引号,否则需要
var fieldType = reader.GetFieldType(i);
object fileValue = reader[i]; if (fieldType == typeof(DateTime))
{
DateTime dt = DateTime.MinValue; if (DateTime.TryParse(fileValue.ToString(), out dt))
{
fileValue = ConvertDateTimeToJson(dt);
}
}
//日期作为特殊情况已经处理过了
var comma = (fieldType == typeof(string) || fieldType == typeof(Guid)) ? "\"" : "";
jsonStr.AppendFormat("\"{0}\":{2}{1}{2},", reader.GetName(i), fileValue, comma);
}
//去掉多余的逗号
jsonStr.Length = jsonStr.Length - ;
jsonStr.Append("}");
} /// <summary>
/// 将.net 日期格式转换成Json日期格式
/// </summary>
/// <param name="dt"></param>
/// <returns></returns>
public static string ConvertDateTimeToJson(DateTime dt)
{
DateTime d1 = new DateTime(, , );
DateTime d2 = dt.ToUniversalTime();
TimeSpan ts = new TimeSpan(d2.Ticks - d1.Ticks);
return string.Format("\"/Date({0})/\"", ts.TotalMilliseconds.ToString("#"));
}
}
}

PS:另外。请教下各位朋友,如何去除Web Api默认托管的Json.net序列化框架,改用自己手工写Json呢?

也就是说,Controller传入、传出的对象是String类型,我自己来负责解析?

【web Api性能提升技巧】(2)从DataReader手工创建Json字符串的更多相关文章

  1. 8 种提升 ASP.NET Web API 性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  2. 六种简单方法提升ASP.NET Web API性能

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  3. 8种提升ASP.NET Web API性能的方法

    英文原文:8 ways to improve ASP.NET Web API performance ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没 ...

  4. [转载]8 种提升 ASP.NET Web API 性能的方法

    http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance 英文原文:8 ways to improve A ...

  5. 8 种提升 ASP.NET Web API 性能的方法 (转)

    出处:http://www.oschina.net/translate/8-ways-improve-asp-net-web-api-performance ASP.NET Web API 是非常棒的 ...

  6. 8 种提升ASP.NET Web API性能的方法

    ASP.NET Web API 是非常棒的技术.编写 Web API 十分容易,以致于很多开发者没有在应用程序结构设计上花时间来获得很好的执行性能. 在本文中,我将介绍8项提高 ASP.NET Web ...

  7. Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案

    Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案 1. 业务场景 android+webview h5 css背景图性能提升1 2. ...

  8. 使用Jil序列化JSON提升Asp.net web api 性能

    JSON序列化无疑是Asp.net web api 里面性能提升最重要的一环. 在Asp.net web api 里面我们可以插入自定义的MediaTypeFormatter(媒体格式化器), 说白了 ...

  9. Web 应用性能提升 10 倍的 10 个建议

    转载自http://blog.jobbole.com/94962/ 提升 Web 应用的性能变得越来越重要.线上经济活动的份额持续增长,当前发达世界中 5 % 的经济发生在互联网上(查看下面资源的统计 ...

随机推荐

  1. xc_domain_save.c

    /****************************************************************************** * xc_linux_save.c * ...

  2. Struts2_day04--课程介绍_Struts2拦截器概述&底层原理_重要的概念

    Struts2_day04 上节内容 今天内容 Struts2拦截器概述 拦截器底层原理 重要的概念 自定义拦截器 自定义登录拦截器 Struts2的标签库 Struts2表单标签(会用) Strut ...

  3. Socket通信编程实例(SIB和SS'SOB)

    客户端: package socket; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  4. Android下在onCreate中获取控件的宽度和高度(通过回调)

    有时候需要在onCreate方法中知道某个View组件的宽度和高度等信息, 而直接调用View组件的getWidth().getHeight().getMeasuredWidth().getMeasu ...

  5. gulp报错160

    gulp报错: 这种提示,说明端口被占用,并且要改端口号,首先,我需要把Apache服务器关掉, 然后在gulpfile.js里: 把8080的端口号加进去.就解决了

  6. 【BZOJ4819】[Sdoi2017]新生舞会 01分数规划+费用流

    [BZOJ4819][Sdoi2017]新生舞会 Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴.有n个男生和n个女生参加舞会 买一个男生和一个女 ...

  7. 【BZOJ3289】Mato的文件管理 莫队算法+树状数组

    [BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是 ...

  8. kindeditor在Java项目中的应用以及图片上传配置

    在官网下载Kindededitor的开发包   在项目中javaweb项目中导入kindeditor必须要使用的Jar包(用于文件上传,除非你的富文本编辑器不使用图片上传)jar包可以在官网的开发包中 ...

  9. Zabbix高可用

    上一篇:Zabbix数据库表结构 安装两台Zabbix-server 两台均安装MySQL数据库 数据库做双主互相同步 keepalive做vip偏移 to_master.sh脚本 两边都要安装ssh ...

  10. Zabbix分布式监控

    上一篇:Zabbix的API的使用 zabbix分布式监控 新建一台主机 安装zabbix proxy和数据库 yum -y install mariadb-server zabbix-proxy-m ...