我有一個非常簡單的ASP.NET WebAPI端點,可以對我們的數據庫進行一次調用,並將這些行作爲JSON返回。響應大小約爲180KB(180條記錄)。JSON序列化慢
當我將該項目部署到Azure時,調用需要大約100ms,這很好,但只在第一分鐘時間內突然減少到24秒。
關於下面的代碼,我手動序列化對象,而不是直接返回模式(使用webapi JSON序列化器,它是相同的),爲了理解在哪裏花費時間。
[HttpGet]
[Route("{stuffId}/toys")]
[ResponseType(typeof(IQueryable<FooModel>))]
public HttpResponseMessage GetStuff(int stuffId)
{
var stuff = QueryProcessor.Execute(new GetStuffByIdQuery
{
StuffId = stuffId,
});
var mappedResult = stuff.Map();
var response = Request.CreateResponse(HttpStatusCode.OK);
var json = JsonConvert.SerializeObject(mappedResult);
response.Content = new StringContent(json, Encoding.UTF8, "application/json");
return response;
}
什麼,我意識到是令人驚訝的,時間花費在序列化方法。
var json = JsonConvert.SerializeObject(mappedResult);
什麼是更混亂的是,在Azure上比我們的生產環境中的其他部署相同的代碼到另一個網站,或運行在本地指向生產數據庫,它總是很快。
任何想法爲什麼會發生這種情況?
如果這不會減慢您在Azure中的其他環境,那麼肯定會發現這些環境之間的不同之處有助於找到此問題。知道什麼類型的'東西'將有助於回答這個問題。如果它是一個龐大的對象圖,那麼這可能是一個原因。另外你怎麼知道這是慢速線的SerializeObject調用? –
@matt_lethargic環境完全相同,唯一的區別是問題發生的位置是「生產」,另一個是「預生產」,我們沒有得到那麼多的流量。我知道是SerializeObject調用,因爲我使用完全相同的代碼創建了另一個端點,但沒有執行「SerializeObject」,然後很快。 –
而東西是? stuff.Map()也是做什麼的。如果它使用了一些對象映射器並且延遲執行直到序列化器被調用,那麼可能會導致速度減慢而不是序列化器。寫過很多使用Newtonsoft Json的生產api(我假設你正在使用),我知道序列化很快,除非你在它之前做了一些傻事。 –