Web Api 中的 HttpClient 非常慢

2023-12-09

我正在使用 ASP.NET WebApi (ApiController) 为我的应用程序实现代理,并使用 HttpClient 通过我的授权标头发出请求。它工作得很好,但速度非常慢。下面是主要代码,然后是全局初始化(使用DefaultConnectionLimit)和web.config相关部分。

如您所见,我已经在使用没有代理的静态/共享 HttpClient 对象,并且HttpCompletionOption.ResponseHeadersRead根据实际要求。该 WebApi 端点被并行调用,工作正常。

整个代码运行得足够快,但是当我使用 ResponseHeadersRead 异步时,会返回 HttpRequestMessage,并且正文的其余部分会被下载并直接流式传输到客户端/调用者。

Here is a video显示问题。

public class ProxyController : ApiController
{
  private const string BASE_URL = "https://developer.api.autodesk.com";
  private const string PROXY_ROUTE = "api/viewerproxy/";


  // HttpClient has been designed to be re-used for multiple calls. Even across multiple threads. 
  // https://stackoverflow.com/questions/22560971/what-is-the-overhead-of-creating-a-new-httpclient-per-call-in-a-webapi-client
  private static HttpClient _httpClient;

  [HttpGet]
  [Route(PROXY_ROUTE + "{*.}")]
  public async Task<HttpResponseMessage> Get()
  {
    if (_httpClient == null)
    {
      _httpClient = new HttpClient(new HttpClientHandler() 
         {
            UseProxy = false,
            Proxy = null
         });
      _httpClient.BaseAddress = new Uri(BASE_URL);
    }

    string url = Request.RequestUri.AbsolutePath.Replace(PROXY_ROUTE, string.Empty);
    string absoluteUrl = url + Request.RequestUri.Query;

    try
    {
      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, absoluteUrl);
      request.Headers.Add("Authorization", "Bearer " + AccessToken);

      HttpResponseMessage response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead);

      return response;
    }
    catch (Exception e)
    {
      return new HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
    }
  }
}

Global.asax,虽然我不认为这是连接限制的问题,因为所有请求都已处理,但太慢了......

public class Global : System.Web.HttpApplication
{
  protected void Application_Start(object sender, EventArgs e)
  {
    GlobalConfiguration.Configure(Config.WebApiConfig.Register);

    ServicePointManager.UseNagleAlgorithm = true;
    ServicePointManager.Expect100Continue = false;
    ServicePointManager.CheckCertificateRevocationList = true;
    ServicePointManager.DefaultConnectionLimit = int.MaxValue;
  }
}

以及 Web.Config 的一部分

 <system.web>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime targetFramework="4.6" maxRequestLength="2097151" requestLengthDiskThreshold="16384" requestPathInvalidCharacters="&lt;,&gt;,*,%,&amp;,\,?" />
  </system.web>

通过删除解决<system.diagnostics>web.config 部分。似乎它导致了产出过剩并减慢了所有HttpClient要求。

根据记录,这是我正在使用的代码,导致所有速度缓慢HttpClient.SendAsync来电。但这对于跟踪连接问题很有用:-)

<system.diagnostics>
  <sources>
    <source name="System.Net" tracemode="protocolonly" maxdatasize="1024">
      <listeners>
        <add name="System.Net"/>
      </listeners>
    </source>
    <source name="System.Net.Cache">
      <listeners>
        <add name="System.Net"/>
      </listeners>
    </source>
    <source name="System.Net.Http">
      <listeners>
        <add name="System.Net"/>
      </listeners>
    </source>
  </sources>
  <switches>
    <add name="System.Net" value="Verbose"/>
    <add name="System.Net.Cache" value="Verbose"/>
    <add name="System.Net.Http" value="Verbose"/>
    <add name="System.Net.Sockets" value="Verbose"/>
    <add name="System.Net.WebSockets" value="Verbose"/>
  </switches>
  <sharedListeners>
    <add name="System.Net"
      type="System.Diagnostics.TextWriterTraceListener"
      initializeData="network.log"
    />
  </sharedListeners>
  <trace autoflush="true"/>
</system.diagnostics>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web Api 中的 HttpClient 非常慢 的相关文章

  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 什么是 C 语言的高效工作流程? - Makefile + bash脚本

    我正在开发我的第一个项目 该项目将跨越多个 C 文件 对于我的前几个练习程序 我只是在中编写了我的代码main c并使用编译gcc main c o main 当我学习时 这对我有用 现在 我正在独自开展一个更大的项目 我想继续自己进行编译
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • HLS 流无法在 Apple 设备上运行

    我有一个实时 RTSP 流 我已设法通过 VLC 将其转码为 HLS 现在它可以在 Android 和桌面浏览器上完美运行 通过 Flash 但在 Apple 上不行 我可以在我的虚拟机上的 iPad 和桌面 Safari 上进行测试 我可
  • 使用 XML 字段 Vs.为不稳定的组织创建一个表

    我正在设计一个为组织开具和存储发票的应用程序 问题是这个组织根本不稳定 发票的种类很多 并且可能会增加和变化 首先 我尝试在 DAL 中使用表 一张表用于存储发票 一张表用于发票字段 一张表用于发票字段值 问题是 这种方式需要反射来稍后检测
  • gethostbyaddr 在 Windows 上可以,但在 Linux 上返回 NULL

    这段代码在 Windows 上运行正常 但在 Linux 上 gethostbyaddr 返回 NULL 我尝试了很多改变 但没有成功 我的 etc host conf 有以下行 订购主机 绑定 我运行完整的代码并传递地址 11 234 4
  • C 中的多处理和管道

    我正在努力学习如何与fork 创建新流程并pipes与每个进程进行通信 假设我有一个包含 20 个单词的列表 并且创建了 3 个进程 现在 我需要使用管道在进程之间分发单词 每个进程都会对其接收到的单词列表进行排序 我想要实现这一目标的方式
  • 静态 Azure 托管中的子文件夹

    我想使用 Azure blob 文件存储来托管静态网站 如果 html 页面位于 web storage 的根文件夹中 则效果很好 但是 如果我将网页放入子文件夹中 相对链接 例如 css 文件 将不再起作用 因为它们被解释为基于根的链接
  • 处理球衣的多重异常

    我们该如何处理MultiException包含 Throwable 对象列表的球衣 异常映射器技术在一个异常的情况下工作得很好 但如何处理多个异常呢 您可以通过对 MultiException 调用 getErrors 来获取异常列表 Mu
  • Appium 仅在 Cordova 应用程序上显示 NATIVE_APP 上下文

    我在 Windows 上运行 Appium 以直接在 Android 设备上测试 Cordova 应用程序 但是 当我尝试获取上下文并切换到包含的上下文时WEBVIEW 基本上 推荐的过程 它只返回一个上下文 NATIVE APP 当我使用
  • 如何在 C# 中读取 .wav 文件的比特率

    鉴于我有一个 wav 文件 在 C 中读取其比特率属性的最佳方法是什么 我尝试过Shell 并提出了一个问题 比特率 属性是否固定在索引 28 中 没有答案所以 另外 我现在相信 Shell 不是读取音频文件属性的最佳方法 我研究了不同的开
  • 如何使用 linkRadial 绘制两点之间的链接?

    我需要手动绘制圆上的点和聚集在该圆中心的点之间的一些链接 我有源点和目标点的 x y 对 但我不想要它们之间有一条简单的直线 我想要一条曲线 类似于树形图中的链接 我可以用linkHorizontal or linkVertical但它们的
  • 同一 Solr Core 中的多个索引..?

    我正在使用 Apache Solr 我有以下场景 我的 PostGreSQL 数据库中有两个表 其一是 Cars 其他的是 Dealers 现在我有一个数据配置文件Cars像下面这样
  • 大虾PDF:我需要生成嵌套表格

    我需要一个表 其中行实际上是 2 行表 这是一个嵌套表 我怎样才能在虾中做到这一点 也许我需要延期 但是哪一个 现在支持子表 Prawn Document generate subtable pdf do pdf subtable pdf
  • 我们可以在经典 ASP 中创建线程吗?

    我的简单问题是 我们可以在经典 ASP 中创建线程吗 如果是的话怎么办 请帮忙 VBScript 中没有允许您生成新线程的本机方法 另一方面 您可以调用用其他语言 例如 C 编写的多线程 COM 组件
  • 导入错误:没有名为“selenium”的模块

    我正在尝试编写一个脚本来检查网站 这是我第一次使用硒 我正在尝试在 OSX 系统上运行该脚本 虽然我签入了 Library Python 2 7 site packages 并且存在 selenium 2 46 0 py2 7 egg 但当
  • 当我将普通页面重定向到 AMP 页面时出现 500 内部服务器错误 htaccess 错误

    这是我的重定向 AMP 页面的正常页面代码 正常的页面url是https www themobilesapp com Nokia Lumia 638 specifications 3029 这工作正常 但 AMP 页面网
  • 使用 C# 更新 Facebook 状态

    我的桌面应用程序应该更新我的 Facebook 状态 是否有一个 API 允许使用登录名和密码更新状态 预先感谢您的回答 当然有 Net Facebook 工具包它是由 Microsoft 的第 3 方完成的 然后在 CodePlex 上作
  • mysqli 多个查询 - 设置变量产生布尔错误/如何跳过这个?

    得到以下简单的查询 该查询通过 phpmyadmin 可以正常工作 但是当我将其添加到我的 php 网站时 没有返回结果 也没有错误 警告消息 如果我删除 SET N 1 然后就可以正常工作了
  • 将特定文件从多个子目录复制到 R 中的单个文件夹中

    假设我有 3 个文件夹 每个文件夹中都有大量文件 我只想从每个子目录中选择几个文件 然后仅将这些文件粘贴到新文件夹中 让我们调用这 3 个文件夹 桌面 目录 sub 11s gi01 ab 桌面 目录 sub 11f gi01 b 桌面 目
  • 修改悬停时的线条/工具提示

    我正在使用 D3 js 我正在尝试做两件事 在悬停线条时 我想对线条应用样式 颜色为浅蓝色或其他颜色 它可以转到父节点 或最高级别的父节点 任何一个都会对我有很大帮助 如果您知道如何做到这两点 请分享 将鼠标悬停在每个节点的文本上时 我想显
  • cin 输入(输入是 int)当我输入一个字母时,它不会打印一次错误的内容,而是打印一次正确的内容,然后在循环的其余部分中打印

    我正在制作一个乘法练习程序 正如我的标题所示 如果我在控制台中输入一个字母而不是数字 它将显示第一个字母正确 但其余字母错误 即使你不碰键盘 它仍然会输出不正确的结果 ans table i std cout lt lt table lt
  • Web Api 中的 HttpClient 非常慢

    我正在使用 ASP NET WebApi ApiController 为我的应用程序实现代理 并使用 HttpClient 通过我的授权标头发出请求 它工作得很好 但速度非常慢 下面是主要代码 然后是全局初始化 使用DefaultConne