我有一个公开所有动词的ASP.NET Web API - 方法基本上是空的。
要运行项目,您可以这样做:从VS 2017启动一个新的asp.net Web项目 - 然后选择Web API。创建项目后,执行清理然后重建。打开" ValuesController",在PUT方法中放置一个断点,然后运行你的项目。
以下是API的代码(控制器代码 - 我在PUT方法中添加了一行):
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
var x = "value: " + value;
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
对于其他HTTP方法(GET,POST,DELETE),我没有遇到相同的问题或时差(或者它们是非常微不足道的)。
获取时间数据:
POST时间数据:
删除时间数据:
通过 IE 输出时序数据:
现在 - 这是通过 CHROME :
的PUT时序数据我也尝试将我的API放在服务器上 - 因此调用API会调用http://test-server-01/api/values/1等 - 但PUT的相同问题仍然存在。
我的问题:有人可以解释发生了什么吗?与其他VERBS相比,为什么PUT的调用速度如此之慢?这也只发生在Chrome中 - 我尝试在IE中进行相同的调用,从而提高性能。
[增订]
我使用Chrome Dev Tools进行了一些时间收集,我注意到大部分延迟发生在慢速到第一个字节(TTFB)。以下是我的一个时间数据的屏幕截图:
[更新]
以下是IE与Chrome之间没有Fiddler的更多时间数据。使用相应的开发人员工具捕获计时。
上面的时间几乎是IE和Chrome中多个PUT调用的平均值。 Chrome总是~8秒,IE约为4秒。
相比之下,在IE和Chrome中发布POST会导致它们之间的差异微不足道 - 它们都会导致大约20ms到50ms(尽管Chrome几乎总是更快)。
在结果中进行DELETE调用也类似于POST,范围从~10ms到~18ms(Chrome几乎总是更快)。
[更新更多]
我尝试创建MCVE - 但我无法在其他计算机上复制该问题。我把解决方案放在另一台笔记本电脑上,使用VS 2017运行它,通过Chrome点击localhost - 没有延迟/性能差的PUT。我收集的时间数据与POST或DELETE相同或类似。
所以看起来这个问题可能与我的工作机器有关。可能是网络问题?代理?但如果是这样的话 - 不应该所有的电话,包括POST或DELETE或GET都被延迟或者性能不佳吗?或者,为什么IE在PUT上表现更好 - 如果问题与网络/代理相关?
[更新更多]
我使用bash通过curl运行PUT调用 - 非常快,没有任何延迟来自同一台机器,给了我8秒钟的CHROME。