问题标签 [dotnet-httpclient]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 尝试并行运行多个 HTTP 请求,但受到 Windows(注册表)的限制
我正在开发一个应用程序(winforms C# .NET 4.0),我通过一个简单的 HTTP 请求从第三方访问查找功能。我用参数调用一个 url,作为回报,我得到一个带有查找结果的小字符串。很简单。
然而,挑战在于,我必须进行大量此类查找(数千次),并且我想限制所需的时间。因此我想并行运行请求(比如 10-20)。我使用 ThreadPool 来执行此操作,我的代码的简短版本如下所示:
我从另一个地方填写numbersToLookup
(a ),调用并为其提供回调函数以返回每个结果。这行得通,但我发现我没有得到我想要的吞吐量。List<String>
startAsyncLookup
returnLookupResult
最初我认为这可能是第三方的系统很差,但我通过尝试同时从两台不同的机器上运行相同的代码来排除这种情况。这两个中的每一个都需要一个单独的时间,所以我可以排除那个。
然后一位同事告诉我,这可能是 Windows 中的一个限制。我用谷歌搜索了一下,发现在这篇文章中,默认情况下,Windows 将对同一 Web 服务器的并发请求数限制为 HTTP 1.0 的 4 个和 HTTP 1.1 的 2 个(对于 HTTP 1.1,这实际上是根据规范( RFC2068))。
上面提到的同一篇文章也提供了一种增加这些限制的方法。通过向(MaxConnectionsPerServer 和 MaxConnectionsPer1_0Server)添加两个注册表值[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]
,我可以自己控制它。
所以,我尝试了这个(都坐到 20 点),重新启动了我的计算机,并尝试再次运行我的程序。可悲的是,它似乎没有任何帮助。在运行批处理查找时,我还密切关注资源监视器,我注意到我的应用程序(标题被涂黑的应用程序)仍然只使用两个 TCP 连接。
所以,问题是,为什么这不起作用?我链接到的帖子是否使用了错误的注册表值?这可能不再可能在 Windows 中“破解”(我在 Windows 7 上)吗?
万一有人想知道,我还尝试了 ThreadPool 上 MaxThreads 的不同设置(从 10 到 100),这似乎根本不会影响我的吞吐量,所以问题也不应该存在。
.net - 使用 HttpClient,如何将 XDocument 直接保存到请求流中?
使用 HttpWebRequest,我可以调用 XDocument.Save()直接写入请求流:
可以用 做同样的事情HttpClient
吗?直接的方法是
但这会在. _XDocument
MemoryStream
asp.net-web-api - 如何在 HttpReponseMessage 上设置响应 cookie?
我想在 web api 中创建一个演示登录服务,并且需要在响应上设置一个 cookie。我怎么做?或者有没有更好的授权方式?
c# - 在 HttpClient 中使用 await 的异步调用永远不会返回
我从C#
Win8 CP 上基于 xaml 的 Metro 应用程序内部拨打电话;这个调用只是点击一个 Web 服务并返回 JSON 数据。
它挂在await
但http调用实际上几乎立即返回(通过提琴手确认);就好像await
被忽略了,它只是挂在那里。
在您询问之前- 是的 - 专用网络功能已打开。
任何想法为什么这会挂起?
c# - WebRequest.CachePolicy 是否应该在 IIS 中运行的代码中工作?
我有一些在 ApiController (ASP.Net Web API) 中运行的代码,它本身想要向另一个 Web 服务发出 GET 请求。Web 服务(也是我的应用程序的一部分)返回 Cache-Control 标头,指示它返回的内容的到期时间。
我正在使用 new System.Net.Http.HttpClient
,配置了 aWebRequestHandler
以便使用客户端缓存(默认HttpClientHandler
不支持缓存配置,尽管它确实System.Net.WebRequest
用作其底层 HTTP 实现):
在服务器上,我通过...在我的控制器操作中启用缓存...
上面的(缩写的)代码在测试中可以正常工作;我以这种方式多次调用服务,只有第一个调用实际联系服务(通过 IIS 中服务上的日志消息观察);后续调用使用缓存。
但是,运行托管在 IIS 本身上的相同代码,似乎HttpClient
忽略了缓存结果(我还设置了我的 IoC 容器,使得HttpClient
AppDomain 中只存在一个实例)并每次调用该服务。这是作为 AppPoolIdentity 运行的。
有趣的是,如果我将应用程序池更改为作为 NetworkService 运行,则响应的状态码为 401 Unauthorized(我尝试过设置Preauthenticate = true
但WebRequestHandler
状态码仍然是 401)。如果我将应用程序池更改为在我自己的凭据下运行,情况也是如此。
那么,是否有关于在 NetworkService 身份和虚拟 AppPoolIdentity 下运行应用程序池的问题,这会阻止它们使用客户端缓存。WebRequest
无论如何,物理 缓存的内容在哪里?
c# - 未发送 HttpClient 身份验证标头
我正在尝试将HttpClient
用于需要基本 HTTP 身份验证的第三方服务。我正在使用AuthenticationHeaderValue
. 到目前为止,这是我想出的:
看起来 POST 操作工作正常,但我没有取回我期望的数据。通过一些试验和错误,最终使用 Fiddler 嗅探原始流量,我发现授权标头没有被发送。
我见过这个,但我认为我已经将身份验证方案指定为AuthenticationHeaderValue
构造函数的一部分。
有什么我错过的吗?
c# - 多线程和事件
我在多线程和事件方面遇到了一些问题。
我有以下在几个线程中执行的函数:
它被这样调用:
我面临的问题(我认为)是,之后
我的线程取消。我收到一个 AggregateException,它告诉我任务已关闭,所以我想这一定是问题所在。我想要实现的是以下。我的函数,因此当前线程,必须阻塞,直到该事件被触发:
有什么解决办法吗?你能给我一些代码吗?
编辑:
这是 GetProjectInfo 方法:
我在那里得到了 AggregateException。
这是一个例外:
asp.net-web-api - ASP.NET Web API 消息处理程序
是否可以控制自定义消息处理程序的执行顺序?
例如,我可能希望首先执行一个日志处理程序,所以我总是记录一个请求。
除了最后添加日志处理程序之外,我没有看到如何实现这一点。
.net - 如何防止 HttpClient.PostAsync 在大量使用时耗尽所有临时端口?
我有一个 .NET 控制台应用程序,可以批量上传到 RESTful 服务。我正在使用HttpClient
与服务进行通信。默认情况下,HttpClient
使用 aHttpWebRequest
进行连接。我一次只建立一个连接。当我达到接近 4000 个请求时,它们开始失败,给出一个错误解释 -
..系统缺少足够的缓冲区空间或因为队列已满。
我相信这是由于 XP 在我发出 4000 个请求之前耗尽了临时端口。
在运行应用程序时查看 netstat,我可以看到大约 300 个与服务的连接为“已建立”。我一次只建立一个连接。连接显然最终会被关闭,但我应该做些什么来确保这些连接尽快关闭吗?
查看活动连接,我可以看到每个请求都使用了新的临时端口。为避免该错误,有没有办法HttpClient.PostAsync()
重用相同的临时端口?我提出这么多请求的正确方法是什么?
我一次只建立 1 个连接时使用的原因HttpClient.PostAsync()
是我打算将其增加到 2 或 3。我在解决这个问题时将它降低到 1。
编辑:我已经能够通过增加 Windows 注册表中的临时端口范围来解决这个问题,但是我更愿意找到一个基于代码的解决方案,因为将来请求的数量可能会急剧增加。
c# - ASP.NET WebApi:如何使用 WebApi HttpClient 通过文件上传执行多部分发布
我有一个 WebApi 服务处理一个简单表单的上传,比如这个:
但是,我不知道如何使用 HttpClient API 模拟同一篇文章。这FormUrlEncodedContent
一点很简单,但是如何将带有名称的文件内容添加到帖子中?