基于IIS的asp.net webapi性能非常慢,如何提高?

cnwy123 2015-06-30 02:44:27
测试过程:打开200个winform的exe后,采用某种措施,使它们几乎同时对IIS进行访问调用webapi,结果执行完这200个调用总共耗时16秒, 所以我觉得性能非常低,代码如下,请问如何提高(IIS服务器为一般的个人机器 4核4GB)

api代码如下:

[HttpPost]
[ActionName("post2")]
public string post2()
{

SqlConnection con246 = new SqlConnection("server=10.10.7.70;uid=sa;database=wy;pwd=sa;Min Pool Size=1;Max Pool Size=100;");
con246.Open();
SqlCommand cmd246 = con246.CreateCommand();
cmd246.CommandText = "insert insert_table values(getdate(),getdate())";
cmd246.ExecuteNonQuery();
con246.Close();


return "ok";

}



c#客户端代码如下:
string url = "http://localhost:19159//api/user/post2";
HttpClient client = new HttpClient();
this.richTextBox1.Text = client.PostAsync(url, null).Result.Content.ReadAsStringAsync().Result;
...全文
4343 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
源哇 2018-07-22
  • 打赏
  • 举报
回复
这个并发测试的方式不对。接口并发测试要同时开启大量请求线程,并维持一段时间 ,设置监视器(win服务端用perfmon.msc,客户端用vs自带的自动化测试工具 或 Apache JMeter),看看每秒处理请求数 和 每个请求处理的时间,同时观察服务端的CPU,内存等参数。webapi在合理的设计下性能还是不错的, 基于redis+sqlserver的架构可达到 单机 3900+ request/sec 的并发性能,而且进入排队的数量基本为0,时不时有几个请求溜了进排队,cpu 90% 内存50% (闲时cpu 5% 内存 45%)。但是由于Asp.net性能的确不是很乐观 所以对代码质量要求比较高 需要反复测试和优化
西漠以西 2017-05-25
  • 打赏
  • 举报
回复
这200个测试用的exe在多少台电脑上跑的? 如果是一台或者少量的几台,那你的结果没有问题。 windows对于发往同一域名的http请求,有连接数限制。 服务器版默认10个连接,个人版默认2个。 修改你的exe配置文件可以解决你的问题。
  • 打赏
  • 举报
回复
你可以试试改为 ashx,这个是最轻量级的。并且要彻底关闭成事不足败事有余的“路由”功能。如果还是要5秒钟以上,那么你就可以考虑废弃 asp.net 了。因为你很容易编写了造成 asp.net 进程重启的代码、而自己发现不了,假设换成 windows service 或者其他形式的,其实并不会让进程重启。 另外,其实并发测试并不是并发200个请求就完了,而是每一个客户端都应该重复10几次,也就是应该有2000个以上的请求,这样才能知道最终的性能。
dongfo 2017-05-25
  • 打赏
  • 举报
回复
用的是webrequest吧,试试把webrequest.proxy设置为null…… 其实请求1秒就完成了,那15秒是用来等待默认proxy超时的……
修改一下昵称 2016-11-29
  • 打赏
  • 举报
回复
使用async关键字试试 public async Task post2
by_封爱 2016-11-29
  • 打赏
  • 举报
回复
换php 哈哈哈哈哈
罗纳尔迪尼奥 2016-11-29
  • 打赏
  • 举报
回复
WEBAPI 要执行一些流程,这种纯数据接口部署IIS,可以删除一些不必要的流程模块,先预热下应用,然后再测试
编程有钱人了 2015-07-17
  • 打赏
  • 举报
回复
引用 13 楼 K0000000r 的回复:
我也遇到了这个问题。 我同时部署了web service和web api在一台win server 2008 的 IIS 上,都是调用服务器上的加密程序进行加密。 发现web service返回结果只需4-5秒,web api却需要10-11秒,而且记录的日志显示:其实被调函数的内部从头执行到尾只花了3秒左右,web service额外的1-2秒时间可以理解,web api额外的7-8秒时间干嘛去了...十分不解啊...
内存满了吧
K0000000r 2015-07-16
  • 打赏
  • 举报
回复
我也遇到了这个问题。 我同时部署了web service和web api在一台win server 2008 的 IIS 上,都是调用服务器上的加密程序进行加密。 发现web service返回结果只需4-5秒,web api却需要10-11秒,而且记录的日志显示:其实被调函数的内部从头执行到尾只花了3秒左右,web service额外的1-2秒时间可以理解,web api额外的7-8秒时间干嘛去了...十分不解啊...
shizhusz110 2015-07-05
  • 打赏
  • 举报
回复
应该是你测试程序问题吧 200个exe如何统计的呢? 还是多线程测试? 或者是自己测试环境本来就差呢?可以在服务端加日志看服务相应时间,在排查下。
cnwy123 2015-07-04
  • 打赏
  • 举报
回复
我把webapi里面的写数据库的代码都全部删掉,只执行 return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");这一行代码,最后统计发现,200并发,依然还是要花掉15秒左右,真是奇怪!
cnwy123 2015-07-01
  • 打赏
  • 举报
回复
就算很慢 也不至于200个并发需要16秒才执行完毕赛,我这两百个并发,如果不通过IIS,直接将webapi里面的代码嵌入到我的C#客户端里直接访问数据库,只需要200ms就完成了 我深信数据库能够达到这个并发值,但是对于IIS并发能力这么弱 ,始终觉得不应该
showjim 2015-07-01
  • 打赏
  • 举报
回复
既然测试IIS,就不要访问数据库了,直接返回看看怎么样。 另外要除去初始化的代价,比如先预请求一次,然后再测试。 200/16这个太低了,看看是不是客户端写的有问题。
ajianchina 2015-06-30
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
asp.net很慢,webservice或者wcf之类的更慢,因此我们对这类数据服务,都是使用自己根据 HttpListener 扩展出来自定义的web服务器(只要几十行c#代码即可)来承载这类程序,而不用asp.net。
以前从没关注过HttpListener类的具体内容,刚才浏览了相关的一些介绍,我回头要好好研究研究你说的这一问题,做一下对比测试,这对我似乎用处比较大,又跟你学一招了,呵呵。
threenewbee 2015-06-30
  • 打赏
  • 举报
回复
200个exe在一个计算机上?那么,的确会很慢。其实gui是很费资源的。
  • 打赏
  • 举报
回复
asp.net很慢,webservice或者wcf之类的更慢,因此我们对这类数据服务,都是使用自己根据 HttpListener 扩展出来自定义的web服务器(只要几十行c#代码即可)来承载这类程序,而不用asp.net。
  • 打赏
  • 举报
回复
大公司的web测试都会并发1000~10000个测试客户端,并且每一个点再连续运行10次。一般要求达到平均每秒处理上千访问。根据内部机制不同(例如不是sql server而是mongodb),可能要求每秒达到上万才算合格。 asp.net是典型的”慢启动“的,你可以先用2个请求访问一下,然后再开始正式测试。
newtee 2015-06-30
  • 打赏
  • 举报
回复
弄分布式式
cnwy123 2015-06-30
  • 打赏
  • 举报
回复
这是测试嘛 故意模拟200并发的
  • 打赏
  • 举报
回复
你这是200并发啊…… 你确认你有这么高的新增并发?
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。 第一章 序言 第二章 简介 2.1.概述 2.2.背景 2.3.模块 2.4.许可证信息 2.5.支持 第三章 背景 3.1.控制反转 第一部分 核心技术 第四章 对象、对象工厂和应用程序上下文 4.1.简介 4.2.IObjectFactory,IApplicationContext和IObjectDefinition接口介绍 4.2.1.The IObjectFactory和IApplicationContext 4.2.2.对象定义 4.2.3.对象的创建 4.2.3.1.通过构造器创建对象 4.2.3.2.通过静态工厂方法创建对象 4.2.3.3.通过实例工厂方法创建对象 4.2.4.泛型类的对象创建 4.2.4.1.通过构造器创建泛型类的对象 4.2.4.2.通过静态工厂方法创建泛型类的对象 4.2.4.3.通过实例工厂方法创建泛型类的对象 4.2.5.对象标识符(id和name) 4.2.6.Singleton和Prototype 4.3.属性,协作对象,自动装配和依赖检查 4.3.1.设置对象的属性和协作对象 4.3.2.构造器参数解析 4.3.2.1.根据参数类型匹配构造器参数 4.3.2.2.根据参数索引匹配构造器参数 4.3.2.3.根据名称匹配构造器参数 4.3.3.详细讨论对象属性和构造器参数 4.3.3.1.设置空值 4.3.3.2.设置集合值 4.3.3.3.设置泛型集合的值 4.3.3.4.设置索引器属性 4.3.3.5.内联对象定义 4.3.3.6.idref节点 4.3.3.7.引用协作对象 4.3.3.8.value和ref节点的简短格式 4.3.3.9.复合属性名 4.3.4.方法注入 4.3.4.1.查询方法注入 4.3.4.2.替换任意方法 4.3.5.引用其他对象或类型的成员 4.3.5.1.使用对象或类的属性值进行注入 4.3.5.2.使用字段值进行注入 4.3.5.3.使用方法的返回值进行注入 4.3.6.IFactoryObject接口的其它实现 4.3.6.1.Log4Net 4.3.7.使用depends-on 4.3.8.自动装配协作对象 4.3.9.检查依赖项 4.4.类型转换 4.4.1.枚举类型的转换 4.4.2.内置的类型转换器 4.4.3.自定义类型转换器 4.4.3.1.使用CustomConverterConfigurer类 4.5.自定义对象的行为 4.5.生命周期接口 4.5.1.1.IInitializingObject接口和init-method属性 4.5.1.2.IDisposable接口和destroy-method属性 4.5.2.让对象了解自己的容器 4.5.2.1.IObjectFactoryAware接口 4.5.2.2.IObjectNameAware接口 4.5.3.IFactoryObject接口 4.6.抽象与子对象定义 4.7.与IObjectFactory接口交互 4.7.1.获得IFactoryObject对象本身,而非其产品 4.8.使用IObjectPostProcessor接口自定义对象 4.9.使用IObjectFactoryPostProcessor定制对象工厂 4.9.1.PropertyPlaceholderConfigurer类 4.9.1.1.使用环境变量进行替换 4.9.2.PropertyOverrideConfigurer类 4.10.使用alias节点为对象添加别名 4.11.IApplicationContext简介 4.12.配置应用程序上下文 4.12.1.注册自定义解析器 4.12.2.创建自定义资源处理器 4.12.3.配置类型别名 4.12.4.注册类型转换器 4.13.IApplicationContext接口的扩展功能 4.13.1.上下文继承 4.13.2.使用IMessageSource接口 4.13.3.在Spring.NET内部使用资源 4.13.4.松耦合事件模型 4.13.5.IApplicationContext的事件通知 4.14.定制IApplicationContex中对象的行为 4.14.1.IApplicationContextAware标识接口 4.14.2.IObjectPostProcessor接口 4.14.3.IObjectFactoryPostProcessor接口 4.14.4.PropertyPlaceholderConfigurer类 4.15.从其它文件中导入对象定义 4.16.服务定位器访问 第五章. IObjectWrapper接口和类型转换 5.1.简介 5.2.使用IObjectWrapper接口管理对象 5.2.1.读、写普通及嵌套的属性 5.2.2.其它功能 5.3.类型转换 5.3.1.转换枚举类型 5.4.内置类型转换器 第六章. IResource接口 6.1.简介 6.2.IResource接口 6.3.内置的IResource实现类 6.4.IResourceLoader接口 6.5.IResourceLoaderAware接口 6.6.应用程序上下文和IResource路径 第七章. 多线程和并发操作 7.1.简介 7.2.线程本地存储 7.3.同步基础 7.3.1.ISync 7.3.2.SyncHolder 7.3.3.Latch 7.3.4.Semaphore 第八章. 对象池 8.1.简介 8.2.接口和实现 第九章. Spring.NET杂记 9.1.简介 9.2.PathMatcher 9.2.1.通用规则 9.2.2.匹配文件名 9.2.3.匹配子目录 9.2.4.大小写需要考虑,斜线可以任意 第十章. 表达式求值 10.1.简介 10.2.表达式求值 10.3.语言参考 10.3.1.文字表达式 10.3.2.属性,数组,列表,字典,索引器 10.3.2.1.定义内联的数组、列表和词典 10.3.3.方法 10.3.4.操作符 10.3.4.1.关系操作符 10.3.4.2.逻辑操作符 10.3.4.3.算术运算符 10.3.5.赋值 10.3.6.表达式列表 10.3.7.类型 10.3.8.类型注册 10.3.9.构造器 10.3.10.变量 10.3.10.1.'#this'和'#root'变量 10.3.11.三元操作符(If-Then-Else) 10.3.12.列表的投影(Projection)和选择(Selection) 10.3.13. 集合处理器和聚合器 10.3.13.1.Count聚合器 10.3.13.2.Sum聚合器 10.3.13.3.Average聚合器 10.3.13.4.Minimum聚合器 10.3.13.5.Maximum聚合器 10.3.13.6.nonNull处理器 10.3.13.7.distinct处理器 10.3.13.8.sort处理器 10.3.14.引用容器中的对象 10.3.15.Lambda表达式 10.3.16.空目标 10.4.本章使用的示例类型 第十一章. 验证框架 11.1.简介 11.2.用法示例 11.3.验证对象组 11.4.验证对象 11.4.1.条件验证对象 11.4.2.必需性验证对象 11.4.3.正则表达式验证对象 11.4.4.通用验证对象 11.4.5.条件型验证 11.5.验证行为 11.5.1.错误消息行为 11.5.2.通用行为 11.6.引用验证对象 11.7.在ASP.NET中的使用技巧 11.7.1.显示验证错误 11.7.1.1.配置错误显示类 第十二章. 使用Spring.NET进行面向方面的编程 12.1.简介 12.1.1.AOP基本概念 12.1.2.Spring.NET AOP的功能 12.1.3.Spring.NET的AOP代理 12.2.Spring.NET中的切入点 12.2.1.概念 12.2.2.切入点的操作 12.2.3.Spring.NET提供的切入点实现类 12.2.3.1.静态切入点 12.2.3.2.动态切入点 12.2.4.自定义切入点 12.3.Spring.NET的通知类型 12.3.1.通知的生命周期 12.3.2.通知类型 12.3.2.1.拦截环绕通知 12.3.2.2.前置通知 12.3.2.3.异常通知 12.3.2.4.后置通知 12.3.2.5.引入通知 12.4.Spring.NET中的Advisor 12.5.使用ProxyFactoryObject创建AOP代理 12.5.1.基本原理 12.5.2.ProxyFactoryObject的属性 12.5.3.代理接口 12.5.4.代理一个类 12.6.使用ProxyFactory类以编程方式创建AOP代理 12.7.管理目标对象 12.8.使用“自动代理”功能 12.8.1.自动代理对象的定义 12.8.1.1.ObjectNameAutoProxyCreator 12.8.1.2.DefaultAdvisorAutoProxyCreator 12.8.1.3.AbstractAutoProxyCreator 12.8.2.使用特性驱动的自动代理 12.9.使用TargetSources 12.9.1.动态切换TargetSource 12.9.2.池化TargetSource 12.9.3.PrototypeTargetSource 12.10.定义新的通知类型 12.11.参考资源 第十三章.通用日志抽象层 13.1.简介 13.1.1.Logging API 13.2.实现与配置 13.2.1.控制台Logger 13.3.Log4Net 第二部分. 中间层数据访问 第十四章. 事务管理 14.1.简介 14.2.动机 14.3.核心接口 14.4.用事务进行资源同步 14.4.1.高层次方法 14.4.2.低层次方法 14.5.声明式事务管理 14.5.1.理解Spring.NET声明式事务管理的实现 14.5.2.第一个例子 14.5.3.Transaction特性的设置 14.5.4.通过AutoProxyCreator使用声明式事务 14.5.5.通过TransactionProxyFactoryObject使用声明式事务 14.5.6. 通过ProxyFactoryObject使用声明式事务 14.5.7. Using Abstract object definitions 14.5.8. Declarative Transactions using ProxyFactoryObject 14.6. 编程方式的事务管理 14.6.1.使用TransactionTemplate 14.6.2.使用IPlatformTransactionManager 14.7.选择编程方式还是声明方式 第十五章. 数据访问对象 15.1.简介 15.2.统一的异常体系 15.3.为数据访问对象提供的统一抽象基类 第十六章. DbProvider 16.1.简介 16.1.1.IDbProvider和DbProviderFactory 16.1.2. XML配置 16.1.3.管理连接字符串 第十七章. 使用ADO.NET进行数据访问 17.1.简介 17.2.动机 17.3.Provider抽象 17.3.1.创建IDbProvider类型的实例 17.4.命名空间 17.5.数据访问的方式 17.6.AdoTemplate简介 17.6.1.执行回调 17.6.2.在.NET 2.0中执行回调 17.6.3. .NET 1.1 17.6.4.AdoTemplate方法指南 17.7.异常翻译 17.8.参数管理 17.8.1. IDbParametersBuilder 17.8.2. IDbParameters 17.9. Mapping DBNull values 17.10. Basic data access operations 17.10.1. ExecuteNonQuery 17.10.2. ExecuteScalar 17.11. Queries and Lightweight Object Mapping 17.11.1. ResultSetExtractor 17.11.2. RowCallback 17.11.3. RowMapper 17.11.4. Query for a single object 17.11.5. Query using a CommandCreator 17.12. DataTable and DataSet 17.12.1. DataTables 17.12.2. DataSets 17.13. Deriving Stored Procedure Parameters 17.14. Database operations as Objects 17.14.1. AdoNonQuery 17.14.2. AdoQuery 17.14.3. MappingAdoQuery 17.14.4. Stored Procedure 17.14.5. DataSetOperation 18. ORM集成 18.1. 简介 第三部分. Web框架 第十九章. Web框架 19.1.简介 19.2.自动装载应用程序上下文和应用程序上下文嵌套 19.2.1. 配置 19.2.2.上下文嵌套 19.3.为ASP.NET页面进行依赖注入 19.3.1.为Web控件进行依赖注入 19.4.Master Page 19.4.1.将子页面与Master Page关联 19.5.双向数据绑定 19.5.1.数据绑定的后台实现 19.5.1.1.绑定方向 19.5.1.2.Formatters 19.5.1.3.类型转换 19.5.1.4.数据绑定事件 19.6.本地化 19.6.1.使用Localizer进行自动本地化(“推”模型) 19.6.2.使用Localizer 19.6.3.手动应用资源(“拉”模型的本地化) 19.6.4.在Web应用程序中进行图像本地化 19.6.5.全局资源 19.6.6.用户语言文化管理 19.6.6.1. DefaultWebCultureResolver 19.6.6.2. RequestCultureResolver 19.6.6.3. SessionCultureResolver 19.6.6.4. CookieCultureResolver 19.6.7.更改语言文化 19.7.结果映射 19.8.客户端脚本 19.8.1.在HTML的head节点内注册客户端脚本 19.8.2.向节点中添加CSS定义 19.8.3.全局目录(Well-Known Directories) 第四部分. 服务 第二十章. .NET Remoting 20.1.简介 20.2.在服务端发布SAO 20.2.1.SAO Singleton 20.2.2.SAO SingleCall 20.2.3.IIS应用程序配置 20.3.在客户端访问SAO 20.4.CAO 最佳实践 20.5.在服务端注册CAO 20.5.1.向CAO对象应用AOP通知 20.6.在客户端访问CAO 20.6.1.向客户端的CAO对象应用AOP通知 20.7. XML Schema for configuration 20.8.参考资源 第二十一章. .NET企业服务 21.1.简介 21.2.服务组件 21.3.服务端 21.4.客户端 第二十二章. Web服务 22.1.服务端 22.1.1.消除对.asmx文件的依赖 22.1.2.向web服务中注入依赖项 22.1.3.将PONO发布为web服务 22.1.4.将AOP代理发布为web服务 22.1.5.客户端的问题 22.2.客户端 22.2.1.WebServiceProxyFactory 22.2.2.WebServiceClientFactory 第二十三章. Windows后台服务 23.1.备注 23.2.简介 23.3.Spring.Services.WindowsService.Process.exe应用程序 23.3.1.安装 23.3.2.配置 23.4.将应用程序上下文发布为Windows服务 23.4.1.service.config 23.4.1.1.让应用程序了解自身的位置 23.4.2.watcher.xml - 可选的配置 23.4.3.bin目录 - 可选 23.5.自定义或扩展 23.5.1. .config文件 第五部分. 与Visual Studio.NET集成 第二十四章. 与Visual Studio.NET集成 24.1.XML编辑与验证 24.2.XML Schema的版本 24.3.集成API文档 第六部分. 快速入门程序 第二十五章. IoC快速入门 25.1.简介 25.2.Movie Finder 25.2.1.开始建立MovieFinder应用程序 25.2.2.第一个对象定义 25.2.3.属性注入 25.2.4.构造器参数注入 25.2.5.总结 25.2.6.日志 25.3.应用程序上下文和IMessageSource接口 25.3.1.简介 25.4.应用程序上下文和IEventRegistry接口 25.4.1.简介 25.5.对象池示例 25.5.1.实现Spring.Pool.IPoolableObjectFactory 25.5.2.使用池中的对象 25.5.3.利用executor执行并行的grep 25.6.AOP 第二十六章. AOP指南 26.1.简介 26.2.基础知识 26.2.1.应用通知 26.2.2.使用切入点-基本概念 26.3.深入探讨 26.3.1.其它类型的通知 26.3.1.1.前置通知 26.3.1.2.后置通知 26.3.1.3.异常通知 26.3.1.4.引入(mixins) 26.3.1.5.通知链 26.3.1.6.配置通知 26.3.2.使用特性定义切入点 26.4.The Spring.NET AOP Cookbook 26.4.1.缓存 26.4.2.性能监视 26.4.3.重试规则 Spring.NET AOP最佳实践 第二十七章. .NET Remoting快速入门 27.1.简介 27.2.Remoting实例程序 27.3.实现 27.4.运行程序 27.5.Remoting Schema 27.6.参考资源 第二十八章. Web框架快速入门 28.1.简介 第二十九章. SpringAir - 参考程序 29.1.简介 29.2.架构 29.3.实现 29.3.1.业务层 29.3.2.服务层 29.3.3.Web层 29.4.总结 第三十章. 数据访问快速入门 30.1.简介 第三十一章. 事务管理快速入门 31.1.简介 31.2.应用程序概述 31.2.1.接口 第七部分. Java开发人员必读 第三十二章. Java开发人员必读 32.1.简介 32.2.Beans和Objects 32.3.PropertyEditor和TypeConverter 32.4.ResourceBundle和ResourceManager 32.5.异常 32.6.应用程序配置 32.7.AOP框架

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧