天道酬勤,学无止境

WebAPI Slow first call to service

I was having issues with WCF and slow startup times, so i switched all of my code to use WebAPI. While the startup time has reduced massively (~8-15 seconds down to ~2) I still have an odd latency on startup. Currently its about ~2 seconds but subsequent calls are under 0.5 seconds consistently, until a timeout occurs.

I reviewed all of my ApplicationPool settings to ensure there wasn't any startup delays or idle timeout settings.

I found this link Very slow first call to web service which didn't help me - i still get the same speed issue on a cold start. Also found this one First call to web service each day is slow again doesn't seem to apply to me.

I enabled tracing on my WebAPI service and found that the only difference between my first and second call are two lines showing WebHostHttpControllerTypeResolver.GetControllerTypes. I can't seem to find too much about this but it is the only difference i can see.

Is there any other sort of logging that i could use to determine what is actually going on?

评论


This is a summary of my conversation beneath the question


Well the timeouts are never the same, but the same ballpark...to expand, i publish the server - first call is ~2 seconds - subsequent calls are ~0.5 seconds. After maybe 20 minutes (hard to determine the actual time) the same occurs - ~2 then ~0.5.

20 minutes - that's the default AppPool Idle Time-out (minutes). So it sounds like IIS unloads your app pool so that the next time you hit it after 20 mins it "loads it all up again" (not sure if it recompiles) hence the lag. You could make it 0 to disable timeout (beware repercussions) or just make it a larger value.

If you disable timeout, you might want to consider adding a scheduled task to recycle your app-pool at times of low usage, perhaps 1:00 am or a time suitable for your needs.

A Note of WCF

I was having issues with WCF and slow startup times

This is my experience too (with IIS-hosted WCF) and like I mention above, just disabled the timeout on the app-pools for my WCF services. This keeps them nice and warm. In addition, I have a daily recycle event at a time when I know my system won't be used to allow IIS to do some housekeeping.

WCF hosted in IIS is as far as IIS is concerned, just another IIS app. :)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • .Net WebApi 中的多重等待异步(Multiple Await Async in .Net WebApi)
    问题 我们有许多使用await / async关键字的异步控制器和服务。 许多动作看起来有点像: public async Task<SomeViewModel> Get(int id) { var someData = await _service.GetData(id); var someOtherData = await _service.GetMoreData(id); return new SomeViewModel { Data = someData, OtherData = someOtherData, } } 可能是服务调用本身也有多个await s。 await通常针对对实体框架、服务总线或 3rd 方 Web 端点的async调用。 我的一位同事今天来表示,这种代码毫无意义,它只会为线程管理生成额外的工作,而在负载不足的情况下,我们实际上会为运行时生成更多工作,并降低应用程序的速度结果。 他们是对的吗?如果是这样,当您在 Web API 请求中有多个 IO 绑定调用时, async / await最佳实践是什么? 回答1 我的一位同事今天来表示,这种代码毫无意义,它只会为线程管理生成额外的工作,而在负载不足的情况下,我们实际上会为运行时生成更多工作,并降低应用程序的速度结果。 这很有趣,因为事实恰恰相反。 正如其他回答者指出的那样,如果您使用的是真正的异步操作
  • ASP.NET WebAPI +肥皂(ASP.NET WebAPI + Soap)
    问题 WebAPI是否支持SOAP? 我正在尝试用MVC4编写SOAP服务器,尽管我可以在WCF中完成它,但似乎WebAPI正在取代它,但是我还没有办法在其中使用SOAP,仅是使用REST风格接口的JSON / XML。 回答1 引用斯科特·古思里(Scott Guthrie)的话:过去几年中,Web API的兴起-通过纯HTTP而不是通过更正式的服务合同(例如SOAP或WS *)公开的服务。 所以我会说不。 回答2 您应该考虑查看ServiceStack,它允许您的同一服务支持REST + SOAP API,尽管由于SOAP仅通过HTTP POST起作用,所以它有一些限制。 添加ServiceStack参考 作为SOAP的替代方案,ServiceStack提供了WCF的“添加服务引用”的更好替代方案,后者可以使用ServiceStackVS内置的“添加ServiceStack引用”功能从URL生成类型化的API。 与WCF相比的优势 简单使用小型T4模板保存生成的POCO类型。 更新和重新运行T4模板一样容易多功能Clean DTO可在所有JSON,XML,JSV,MsgPack和ProtoBuf通用服务客户端中使用可重用的生成的DTO不会耦合到任何端点或格式。 默认设置为部分设置和虚拟设置,以实现最大程度的重用与RPC服务相比
  • Multiple Await Async in .Net WebApi
    We have a number of async controllers and services that make use of the await/async keywords. A number of the actions look a little like: public async Task<SomeViewModel> Get(int id) { var someData = await _service.GetData(id); var someOtherData = await _service.GetMoreData(id); return new SomeViewModel { Data = someData, OtherData = someOtherData, } } It might be that the service calls themselves also have multuple awaits. The await will typically be against an async call to entity framework, a service bus or a 3rd party web endpoint. One of my colleagues came to be today suggesting that this
  • ASP .NET MVC 4 WebApi:手动处理OData查询(ASP .NET MVC 4 WebApi: Manually handle OData queries)
    问题 我有一个使用ASP .NET MVC 4提供的WebAPI制作的Web服务。我知道WebAPI可以在其上工作的层自动处理OData查询(例如$filter , $top , $skip ),但是如果我想要的话该怎么办?由我自己处理过滤? 我不仅从数据库中返回数据,而且还有另一层添加一些属性,进行一些转换等。所以查询我的所有数据,将它们转换并返回到WebAPI类以进行OData过滤不仅是一件好事足够的。 这当然很慢,而且通常是个a脚的主意。 那么,是否有一种方法可以将OData查询参数从WebAPI入口点传播到我为获取和转换数据而调用的函数? 例如,对/api/people?$skip=10&$top=10的GET将在服务器上调用: public IQueryable<Person> get() { return PersonService.get(SomethingAboutCurrentRequest.CurrentOData); } 并且在PersonService : public IQueryable<Person> getPeople(var ODataQueries) { IQueryable<ServerSidePerson> serverPeople = from p in dbContext.ServerSidePerson select p; //
  • ASP .NET MVC 4 WebApi: Manually handle OData queries
    I have a Web Service made using the WebAPI provided by ASP .NET MVC 4. I know that the layer on top of which WebAPI works automatically handles OData Queries (such as $filter, $top, $skip), but what if I want to handle the filtering by myself? I don't simply return data from my database, but I have another layer which adds some properties, makes some conversions etc. So querying ALL of my data, converting them and returning them to the WebAPI class for OData filtering isn't just good enough. It's of course terribly slow, and generally a crappy idea. So is there a way to propagate the OData
  • 为什么要创建异步WebAPI操作而不是同步操作?(Why should I create async WebAPI operations instead of sync ones?)
    问题 我在创建的Web API中执行以下操作: // GET api/<controller> [HttpGet] [Route("pharmacies/{pharmacyId}/page/{page}/{filter?}")] public CartTotalsDTO GetProductsWithHistory(Guid pharmacyId, int page, string filter = null ,[FromUri] bool refresh = false) { return delegateHelper.GetProductsWithHistory(CustomerContext.Current.GetContactById(pharmacyId), refresh); } 通过以下方式通过Jquery Ajax调用来完成对该Web服务的调用: $.ajax({ url: "/api/products/pharmacies/<%# Farmacia.PrimaryKeyId.Value.ToString() %>/page/" + vm.currentPage() + "/" + filter, type: "GET", dataType: "json", success: function (result) { vm.items([]); var data =
  • HttpClient on WebApi is extremely slow
    I'm implementing a Proxy for my application using ASP.NET WebApi (ApiController) and using HttpClient to make the request with my authorization header. It works fine, but it's extremely slow. Below is the main code, then the Global initialization (with DefaultConnectionLimit) and web.config related piece. As you can see, I'm already using a static/shared HttpClient object with no Proxy and HttpCompletionOption.ResponseHeadersRead on the actual request. This WebApi endpoint is called in parallel, which works fine. The entire code runs fast enough, but as I'm using ResponseHeadersRead async, the
  • ASP.NET Core WebApi构建API接口服务实战演练
    一、ASP.NET Core WebApi课程介绍 人生苦短,我用.NET Core!提到Api接口,一般会想到以前用到的WebService和WCF服务,这三个技术都是用来创建服务接口,只不过WebAPI用起来更简单,更轻量级,更流行。构建一个优秀的API依赖于伟大的框架,今天我们的主角当然是微软的跨平台轻量级HTTP服务框架——Asp.net Core WebApi。今天阿笨将给大家带来的分享课程是如何利用ASP.NET Core WebApi跨平台开发技术构建我们的API服务应用程序并在部署运行不同的OS系统平台上,真真的体现.NET Core的跨平台强大之处: 实现一次编译,多平台部署运行! 1.1、本次分享课程包含知识点如下: ★与ASP.NET Core WebAPI的第一次亲密接触 ★ ASP.NET Core WebAPI集成Swagger在线API接口文档 ★ ASP.NET Core WebAPI如何实现多接口版本控制 ★ ASP.NET Core WebApi标准格式化统一输出响应报文数据 ★ ASP.NET Core WebApi标准格式化统一输出异常报文数据 ★ 开箱即用的BaseApiController工具基类,WebApi你值得拥有 ★ ASP.NET Core WebApi开启服务端跨域CORS ★ ASP.NET Core
  • 编写第一个 .NET 微服务
    介绍本文的目的是:通过创建一个返回列表的简单服务,并在 Docker 容器中运行该服务,让您熟悉使用 .NET 创建微服务的构建过程。安装 .NET SDK要开始构建 .NET 应用程序,首先下载并安装 .NET Core SDK(软件开发工具包)。根据操作系统的类型下载并安装对应版本的 .NET Core SDK v3.1: .NET SDK (64-位):https://dotnet.microsoft.com/download/dotnet-core/thank-you/sdk-3.1.401-windows-x64-installer.NET SDK (32-位):https://dotnet.microsoft.com/download/dotnet-core/thank-you/sdk-3.1.401-windows-x86-installer检查安装是否正确.NET SDK 安装完成后,打开一个命令提示符窗口并运行以下命令:dotnet如果命令运行时,打印出的信息是介绍如何使用 dotnet,说明安装正确。创建您的服务创建一个应用在命令提示符窗口运行以下命令:dotnet new webapi -o myMicroservice --no-httpscd myMicroservice第一行中 dotnet 命令创建了一个 webapi(一个 REST API 终端
  • JavaWeb开发——webAPI和web Service
    1.webAPI是什么? 引用:Web API简介 web api(网络 应用程序接口) API的种类 1.第三方API:如google地图 从某种角度讲,植根于第三方服务器上。要通过 JavaScript获取它们,您首先需要链接到其功能接口上并使其在您的页面上生效。 2.RESTful API:如new york Time API 这种类型的API称为RESTful API - 我们不像使用Google地图那样使用JavaScript库的功能获取数据,而是通过向特定网址发出HTTP请求来获取数据,其中包含搜索术语和其他属性编码的数据 URL(通常作为URL参数)。 这是您在API中遇到的常见模式。 如何使用第三方API 如何使用第三方API; 1.首先,你需要查找文档 2.获取一个开发者密匙 3.将API连接到你的应用 例: <script type="text/javascript" src="https://maps.google.com/maps/api/js?key=AIzaSyDDuGt0E5IEGkcE6ZfrKfUtE9Ko_de66pA"></script> 4.从API请求数据 5.展示数据 2.Web service和web API的区别 Web service和web API的区别 web service 是基于xml和 soap协议 web API
  • .Net Core 3.0 IdentityServer4 快速入门
    .Net Core 3.0 IdentityServer4 快速入门 一、简介   IdentityServer4是用于ASP.NET Core的OpenID Connect和OAuth 2.0框架。   将IdentityServer4部署到您的应用中具备如下特点:   1)、认证服务   2)、单点登陆   3)、API访问控制   4)、联合网关   5)、专注于定制   6)、成熟的开源系统   7)、免费和商业支持 二、整体部署   目前大多数的应用程序或多或少看起来是上图所示这样的,最常见的交互场景有(浏览器与Web应用程序、Web应用程序与WebApi通讯、本地应用程序狱WebApi通讯、基于浏览器的应用程序与WebApi 通讯、基本服务器的应用程序与WebApi通讯、WebApi与WebApi通讯)   前端、中间层、后端各个层级为了保护资源经常要针对相同的用户仓储区实现身份认证和授权,但是如果我们把这些基本的安全功能统一颁发给一个安全令牌服务,就可以不必再让这些应用和端点之间重复实现这些基础安全功能,重组应用程序以支持安全令牌服务将会引导出以下体系结构和协议   这样的设计将会把安全问题分为两个部分:(身份验证和API访问) 三、IdentityServer4如何提供帮助   IdentityServer是将规范兼容的OpenID Connect和OAuth 2
  • abp(net core)+easyui+efcore实现仓储管理系统——ABP WebAPI与EasyUI结合增删改查之七(三十三)
    abp(net core)+easyui+efcore实现仓储管理系统目录 烟雨红尘小说网 wap.zuxs.net abp(net core)+easyui+efcore实现仓储管理系统——ABP总体介绍(一) abp(net core)+easyui+efcore实现仓储管理系统——解决方案介绍(二) abp(net core)+easyui+efcore实现仓储管理系统——领域层创建实体(三) abp(net core)+easyui+efcore实现仓储管理系统——定义仓储并实现 (四) abp(net core)+easyui+efcore实现仓储管理系统——创建应用服务(五) abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之控制器(六) abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之列表视图(七) abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之增删改视图(八) abp(net core)+easyui+efcore实现仓储管理系统——展现层实现增删改查之菜单与测试(九) abp(net core)+easyui+efcore实现仓储管理系统——多语言(十) abp(net core)+easyui+efcore实现仓储管理系统—
  • 如何从Windows服务调用WebAPI(How to call a WebAPI from Windows Service)
    问题 我有一个用Windows Service编写的应用程序,该应用程序需要调用用Asp.Net MVC 4 WebAPi编写的WebAPI。 WebAPI中的此方法返回具有原始类型的DTO,例如: class ImportResultDTO { public bool Success { get; set; } public string[] Messages { get; set; } } 在我的webapi中 public ImportResultDTO Get(int clientId) { // process.. and create the dto result. return dto; } 我的问题是,如何从Windows服务中调用webApi? 我有我的URL和参数值,但我不知道如何调用以及如何将xml结果反序列化到DTO。 谢谢 回答1 您可以使用System.Net.Http.HttpClient。 显然,在下面的示例中,您将需要编辑伪造的基地址和请求URI,但这也显示了一种检查响应状态的基本方法。 // Create an HttpClient instance HttpClient client = new HttpClient(); client.BaseAddress = new Uri("http://localhost:8888/"); //
  • How to call a WebAPI from Windows Service
    I have an application written in Windows Service and this app need to make a call to a WebAPI written in Asp.Net MVC 4 WebAPi. this method in WebAPI return a DTO with primitive type, something like: class ImportResultDTO { public bool Success { get; set; } public string[] Messages { get; set; } } and in my webapi public ImportResultDTO Get(int clientId) { // process.. and create the dto result. return dto; } My question is, how can I call the webApi from the Windows Service? I have my URL and value of parameter, but I don't know how to call and how to deserialize the xml result to the DTO
  • 引入Jaeger——使用
    上一篇定义了两种使用Jaeger的方式:中间件和action过滤器,下面这个例子定义了两个服务 WebAPI01,请求WebAPI02,采用的是中间件的请求方式。 引入JaegerSharp包(或发布到自己的Nuget库里引用) WebAPI01的Startup using JaegerSharp; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.OpenApi.Models; using System; namespace WebAPI01 { public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public void ConfigureServices
  • 自托管WebAPI应用程序引用来自不同程序集的控制器(Self-hosting WebAPI application referencing controller from different assembly)
    问题 我碰到了这颗宝石,似乎很接近我想要的。 但是,我想使用引用程序集中已经编写好的控制器。 我的第一个难题是引用程序集,设置与原始webAPI项目相同的路由规则,然后进行,但是每次尝试调用自托管服务时,我都会得到400s。 我已经了解了Fiddler的请求内幕,除了地址差异之外,针对webAPI项目和自托管项目的请求是相同的。 我觉得这应该是相对简单的,但是我还没有找到一个可以接受的答案。 回答1 这似乎是一个已知问题。 您必须强制.NET用所需的控制器加载程序集。 在自托管Web API之前,应从引用程序集中检索要由运行时加载的类型。 像这样的东西: Type controllerType = typeof(ReferencedControllers.ControllerType); 这应该从该程序集中加载控制器,并且不会出现404错误。 回答2 Praveen和Janushirsha的先前帖子将我引向正确的方向,我在这里恢复: // Not reliable in Release mode : Type controllerType = typeof(ReferencedControllers.ControllerType); 因此,您应该将IAssembliesResolver替换为: HttpConfiguration config = new
  • 如何配置Web Api 2在单独的项目中查找Controller? (就像我以前在Web Api中所做的一样)(How to configure Web Api 2 to look for Controllers in a separate project? (just like I used to do in Web Api))
    问题 我曾经将控制器放置在Mvc Web Api中的单独的类库项目中。 我曾经在我的Web api项目的global.asax中添加以下行,以在单独的项目中查找控制器: ControllerBuilder.Current.DefaultNamespaces.Add("MyClassLibraryProject.Controllers"); 除了添加上述行外,我再也不需要做任何其他配置。 这对我来说一直很好。 但是,我无法使用上述方法在WebApi2中执行相同的操作。 就是行不通。 WebApi2项目仍尝试在其自己项目的controllers文件夹中查找控制器。 -2个月后几乎未提供任何摘要更新(因为我对此开始赏金): 我创建了一个WebApiOne解决方案,它有2个项目,第一个是WebApi项目,第二个是控制器的类库。 如果我将对控制器类库项目的引用添加到WebApi项目中,则所有工作都将按预期进行。 即,如果我去http://mydevdomain.com/api/values,我可以看到正确的输出。 我现在创建了另一个名为WebApiTwo的项目,它有2个项目,第一个是WebApi2项目,第二个是控制器的类库。 如果我将对控制器类库项目的引用添加到WebApi2项目中,则无法按预期工作。 即,如果我转到http://mydevdomain.com/api/values,则会收到
  • ASP.NET Core中为指定类添加WebApi服务功能
    POCO Controller是 ASP.NET Core 中的一个特性,虽然在2015年刚发布的时候就有这个特性了,可是大多数开发者都只是按原有的方式去写,而没有用到这个特性。其实,如果利用这个特性进行稍微封装后,用在SOA架构中Service层的场景中是极其便利的。这篇文章主要就是说我最近在学习使用开源AOP库AspectCore写WebApi动态代理客户端的时候,实现为普通类无添加WebApi服务的过程。POCO控制器简介POCO控制器就是ASP.NET Core项目中所有带有Controller后缀的类、或者标记了[Controller]特性的类,虽然没有像模版项目中那样继承自Controller类,也会被识别为控制器,拥有跟普通控制器一样的功能,像下面这段代码中,两个类都会被识别成控制器:public class PocoController { public IActionResult Index() { return new ContentResult() { Content = “Hello from POCO controller!” }; } } [Controller] public class Poco { public IActionResult Index() { return new ContentResult() { Content = “Hello
  • IoC:温莎城堡和WebAPI(IoC: Castle Windsor and WebAPI)
    问题 我有一个使用Castle Windsor的MVC4站点,我想向其中添加一些WebAPI调用,因此我开始在互连网上进行一些挖掘。 现在我不知道IoC的来龙去脉; 我遵循了有关如何在我的项目上设置Castle Windsor的教程,将IUnitOfWorkFactory和IApplicationService注入为基本控制器中的公共属性,并根据需要在控制器构造函数中添加了一些其他接口。 它工作得很顺畅,所以我再也不需要做更多的事情了。 我在WebAPI上阅读的所有内容都被告知DI使用Castle Windsor不能很好地工作,谈论IDependencyResolver和IDependencyScope 。 解决此问题的方法有多种,但有一些变通方法和实现,但是我不清楚问题到底是什么。 包括了代码片段,但是假设您知道它们属于什么类,以及如何调用它们,但是不幸的是我不知道。 另外,我在网上看到的所有示例均涉及一个专有的WebAPI项目,而不是明智地ApiController了两个ApiController的MVC4项目。我不知道这如何或是否会影响任何事情。 为什么我在标准控制器上使用的东西不能在API控制器上使用呢? 要使WebAPI调用和标准Web调用在同一应用程序中工作,杂技需要做什么代码? 回答1 为了将Windsor与webapi一起使用,请遵循http://blog
  • 覆盖Webapi OData链接的主机(Override host of webapi odata links)
    问题 我正在使用WebAPI 2.2和Microsoft.AspNet.OData 5.7.0创建支持分页的OData服务。 当托管在生产环境中时,WebAPI驻留在不对外公开的服务器上,因此OData响应中返回的各种链接(例如, @odata.context和@odata.nextLink指向内部IP地址,例如http://192.168.XX/<AccountName>/api/...等。 通过在每个ODataController方法中实现一些逻辑以将内部URL替换为外部URL(例如https://account-name.domain.com/api/... Request.ODataProperties().NextLink我已经能够修改Request.ODataProperties().NextLink NextLink https://account-name.domain.com/api/... ,但这非常不便,并且只能修复NextLinks。 有什么方法可以在OData服务的配置时设置外部主机名? 我已经看到了一个属性Request.ODataProperties().Path ,想知道是否可以在config.MapODataServiceRoute("odata", "odata", GetModel());上设置基本路径config