当前位置: 首页 > 编程语言 > C#

如何获得快速的.NetHttp请求分享

时间:2023-04-11 02:29:58 C#

如何获得快速的.NetHttp请求我需要一个可以在.Net中使用的不到100毫秒的Http请求。我能够让它在浏览器中工作,所以我真的不明白为什么这是代码中的问题。我已经尝试过WinHTTP和WebRequest.Create,它们都占用了超过500毫秒的时间,这对于我的用例来说是不可接受的。下面是我试图通过的一个简单测试的示例。(WinHttpFetcher是我编写的一个简单包装器,但它确实是获取请求的最简单示例,我不确定它是否值得粘贴。)我使用的LibCurlNet具有可接受的结果,但如果我也使用类,我得到访问冲突。此外,由于它不是托管代码并且必须复制到bin目录,因此它不适合与我的开源项目一起部署。有什么想法可以尝试另一种实现方式吗?[测试]publicvoidWinHttp_Should_Get_Html_Quickly(){varfetcher=newWinHttpFetcher();varstartTime=DateTime.Now;varresult=fetcher.Fetch(newUri("http://localhost"));varendTime=DateTime.Now;Assert.Less((endTime-startTime).TotalMilliseconds,100);}[测试]publicvoidWebRequest_Should_Get_Html_Quickly(){varstartTime=DateTime.Now;varreq=(HttpWebRequest)WebRequest.Create("http://localhost");varresponse=req.GetResponse();varendTime=DateTime.Now;Assert.Less((endTime-startTime).TotalMilliseconds,100);进行基准测试时,最好至少丢弃前两次,因为它们会扭曲结果:此后的时间将更好地反映重复性能。下面是一个测试工具的示例,它会自动忽略JIT和优化过程,并在取平均值以确定性能之前运行一定次数的迭代测试。如您所见,JITpass需要花费大量时间。JIT:410.79毫秒优化:0.98毫秒。平均超过10次迭代:0.38毫秒代码:[测试]publicvoidWebRequest_Should_Get_Html_Quickly(){privateconstintTestIterations=10;privateconstintMaxMilliseconds=100;Actiontest=()=>{WebRequest.Create("http://localhost/iisstart.htm").GetResponse();};AssertTimedTest(TestIterations,MaxMilliseconds,测试);}privatestaticvoidAssertTimedTest(intiterations,intmaxMs,Actiontest){doublejit=Execute(test);//忽略jitpassConsole.WriteLine("JIT:{0:F2}ms.",jit);双优化=执行(测试);//忽略优化传递Console.WriteLine("Optimize:{0:F2}ms.",optimize);双totalElapsed=0;for(inti=0;i使用StopWatch类来获得准确的计时。然后,确保你没有看到未优化的代码或JIT编译的结果。放弃前几次调用,以消除他对JIT的影响,并平均其余的消息。VS.NET具有衡量性能的能力,您可能还想使用类似Fiddler的东西来查看您“在线”花费了多少时间,并理智地检查它是否不是您的IIS/Web服务器导致延迟。500ms是一个很长的时间,这些类可能在10ms左右,所以不要放弃希望(还)。更新#1:这是一篇讨论微基准测试以及您需要避免看到JIT之类东西的好文章:http://blogs.msdn.com/b/vancem/archive/2009/02/06/measureit-update-tool-for-doing-microbenchmarks.aspx你不是微基准,但是这里有很多最佳实践。更新#2:所以,我写了这个控制台应用程序(使用VS.NET2010)...classProgram{staticvoidMain(string[]args){varreq=(HttpWebRequest)WebRequest.Create("http://localhost");varresponse=req.GetResponse();Console.WriteLine(秒表.ElapsedMilliseconds);}}...然后按Ctrl-F5。它是用调试编译的,但我在没有调试的情况下运行它,我得到63毫秒。我在我的Windows7笔记本电脑上运行它,所以http://localhost恢复到默认的IIS7主页。再次运行它,我得到了相似的时间。运行Release版本可以运行在50ms到55ms的范围内。这是我预期的数量级。显然,如果您的站点正在进行ASP.NET重新编译,或回收应用程序池,或进行大量后端处理,您的时间会有所不同。如果您的标记很大,那么它也会有所不同,但是您在客户端使用的类都不应该是速率限制步骤。这将有望由网络和/或远程应用程序处理。尝试将HttpWebRequest实例的Proxy属性设置为null。如果可行,则尝试将其设置为GlobalProxySelection.GetEmptyWebProxy(),这似乎更正确。您可以在这里阅读:-WebRequest慢吗?:http://holyhoehle.wordpress.com/2010/01/12/webrequest-slow/2018年更新:摘自评论。System.Net.GlobalProxySelection已过时。此类已被弃用。使用WebRequest.DefaultWebProxy来访问和设置全局默认代理。使用null而不是GetEmptyWebProxy()。–jirarium2017-07-225:44以上就是C#学习教程:Howtogetfast.NetHttprequest分享的全部内容,如果对大家有用还需要详细了解C#学习教程,我希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: