C# WebAPI 2:无效响应是否比IHttpActionResult更快?
我今天在WebAPI2中构建了一个方法。我的问题是,我应该使我的方法无效,还是将其保留为IHttpActionResult 作为优势,我看到IHttpActionResult可以返回任何响应代码。无效方法的优势是什么?它是更快还是唯一的区别是它总是响应200(或者是204?)C# WebAPI 2:无效响应是否比IHttpActionResult更快?,c#,http,asp.net-web-api,asp.net-web-api2,C#,Http,Asp.net Web Api,Asp.net Web Api2,我今天在WebAPI2中构建了一个方法。我的问题是,我应该使我的方法无效,还是将其保留为IHttpActionResult 作为优势,我看到IHttpActionResult可以返回任何响应代码。无效方法的优势是什么?它是更快还是唯一的区别是它总是响应200(或者是204?) 有人知道哪一个更快吗?或者它是否与我所提到的有任何其他主要区别?(这包括void无法响应任何内容,而IHttpActionResult可以……)来自asp.net web api应用程序的每条消息都会返回http状态代码。
有人知道哪一个更快吗?或者它是否与我所提到的有任何其他主要区别?(这包括void无法响应任何内容,而IHttpActionResult可以……)来自asp.net web api应用程序的每条消息都会返回http状态代码。
异常
非常昂贵,因此,如果您将其传递给web api,框架应该知道如何处理该异常,并将其更改为http消息
结果
没有什么特别的区别。web api中的void
操作方法将返回与200不同的内容-OK
如果代码抛出异常
实际上,我认为它甚至比带有结果类型的方法更昂贵,因为asp.net框架需要获取异常并将其更改为http消息
如果您在操作方法中指定了
http消息
,那么您就知道您对客户端的确切响应(我的意思是,至少是http状态代码
)。我喜欢使用HttpResponseMessage
并使用特定的http状态码创建响应来自asp.net web api应用程序的每条消息都返回一个http状态码。异常
非常昂贵,因此,如果您将其传递给web api,框架应该知道如何处理该异常,并将其更改为http消息
结果
没有什么特别的区别。web api中的void
操作方法将返回与200不同的内容-OK
如果代码抛出异常
实际上,我认为它甚至比带有结果类型的方法更昂贵,因为asp.net框架需要获取异常并将其更改为http消息
如果您在操作方法中指定了http消息
,那么您就知道您对客户端的确切响应(我的意思是,至少是http状态代码
)。我喜欢使用HttpResponseMessage
,并使用特定的http状态码创建响应
@Felipe Oriani,你在那里完全正确。。我很好奇,所以我做了测试。
看到这个惊人的输出
- 无效平均响应时间为2.075 ms
- IHttpActionResult平均响应时间为1.651毫秒李>
这是0.424ms的差值
这是使用以下webAPI代码实现的
[Route("test/void")]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
}
[Route("test/IHttpActionResult")]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
return Ok();
}
[路由(“测试/无效”)]
public void GetFirst()
{
StringBuilder StringBuilder=新的StringBuilder();
对于(int i=0;i<20;i++)
{
stringbuilder.Append(“某物”);
}
//睡眠(1000);
}
[路线(“测试/IHttpActionResult”)]
公共IHttpActionResult GetSecond()
{
StringBuilder StringBuilder=新的StringBuilder();
对于(int i=0;i<20;i++)
{
stringbuilder.Append(“某物”);
}
//睡眠(1000);
返回Ok();
}
此外,我还尝试在每个请求上为webAPI提供更多的工作。。看看差异是否保持不变,或者对于更长的操作,使用IHttpActionResult而不是void是否是真正的改进
我将迭代设置为200000,并在WebAPI代码中取消对Thread.Sleep(1000)的注释
[Route("test/void")]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
}
[Route("test/IHttpActionResult")]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
return Ok();
}
现在,结果如下:
- 无效平均响应时间为11.64毫秒
- IHttpActionResult平均响应时间为11.11毫秒
这是0.53毫秒的差值
对此,我可以得出结论并确认,你所说的是真的。IHttpActionREsult确实比void更快。唯一的区别是,要真正注意到一些事情,就要小心谨慎。但是如果你在寻找微小的优化?这是其中之一
下面的图片显示结果!
@Felipe Oriani,你在哪里完全正确。。我很好奇,所以我做了测试。
看到这个惊人的输出
- 无效平均响应时间为2.075 ms
- IHttpActionResult平均响应时间为1.651毫秒李>
这是0.424ms的差值
这是使用以下webAPI代码实现的
[Route("test/void")]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
}
[Route("test/IHttpActionResult")]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
return Ok();
}
[路由(“测试/无效”)]
public void GetFirst()
{
StringBuilder StringBuilder=新的StringBuilder();
对于(int i=0;i<20;i++)
{
stringbuilder.Append(“某物”);
}
//睡眠(1000);
}
[路线(“测试/IHttpActionResult”)]
公共IHttpActionResult GetSecond()
{
StringBuilder StringBuilder=新的StringBuilder();
对于(int i=0;i<20;i++)
{
stringbuilder.Append(“某物”);
}
//睡眠(1000);
返回Ok();
}
此外,我还尝试在每个请求上为webAPI提供更多的工作。。看看差异是否保持不变,或者对于更长的操作,使用IHttpActionResult而不是void是否是真正的改进
我将迭代设置为200000,并在WebAPI代码中取消对Thread.Sleep(1000)的注释
[Route("test/void")]
public void GetFirst()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
}
[Route("test/IHttpActionResult")]
public IHttpActionResult GetSecond()
{
StringBuilder stringbuilder = new StringBuilder();
for (int i = 0; i < 20; i++)
{
stringbuilder.Append("something");
}
//Thread.Sleep(1000);
return Ok();
}
现在,结果如下:
- 无效平均响应时间为11.64毫秒
- IHttpActionResult平均响应时间为11.11毫秒
这是0.53毫秒的差值
对此,我可以得出结论并确认,你所说的是真的。IHttpActionREsult确实比void更快。唯一的区别是,要真正注意到一些事情,就要小心谨慎。但是如果你在寻找微小的优化?这是其中之一
下面的图片显示结果!
查看我执行的测试!Tnx为伟大的anwser顺便说一句!看看我做的测试!Tnx为伟大的anwser顺便说一句!非常好的测试@spons,它就像一个webapi响应的基准。。。它应该在堆栈溢出的一周内完成。:)@FelipeOriani如果你有任何分歧我可以测试让我知道。。