C# WebAPI 2:无效响应是否比IHttpActionResult更快?

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状态代码。

我今天在WebAPI2中构建了一个方法。我的问题是,我应该使我的方法无效,还是将其保留为IHttpActionResult

作为优势,我看到IHttpActionResult可以返回任何响应代码。无效方法的优势是什么?它是更快还是唯一的区别是它总是响应200(或者是204?)


有人知道哪一个更快吗?或者它是否与我所提到的有任何其他主要区别?(这包括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如果你有任何分歧我可以测试让我知道。。