Tag: dotnet httpclient

HttpClient – 如何判断服务器是否更快停机?

我正在使用.NET HttpClient向我的服务器发送请求。 我已将HttpClient.Timeout属性设置为10秒,因此每当服务器在不到10秒内无法处理我的请求时,我就会获得A task was cancelledexception。 好到这里。 但是,如果关闭服务器, HttpClient大约20秒才能返回正确的exception,例如图片中的exception。 我希望看到这个exception超过1​​0秒能够区分Server Down和Operation花费太长时间的情况。 我在msdn文档中找不到任何相关内容。 是否可以在HttpClient上设置超时? 这是我如何构建HttpClient var webRequestHandler = new WebRequestHandler { UseProxy = false, Proxy = null, AllowPipelining = false, ContinueTimeout = TimeSpan.Zero, UseCookies = false, AllowAutoRedirect = false, }; var httpClient = new HttpClient(webRequestHandler); httpClient.Timeout = timeout; httpClient.DefaultRequestHeaders.TryAddWithoutValidation(“Accept”, “application/json”); httpClient.DefaultRequestHeaders.TryAddWithoutValidation(“User-Agent”, userAgent); httpClient.DefaultRequestHeaders.ExpectContinue = false;

使用HttpClient进行异步文件下载

我有一个服务,它返回一个csv文件到POST请求。 我想使用异步技术下载所述文件。 虽然我可以获取该文件,但我的代码有几个突出的问题和问题: 1)这真的是异步的吗? 2)有没有办法知道内容的长度,即使它是以分块格式发送的? 想想进度吧)。 3)如何最好地监控进度,以便在所有工作完成之前推迟程序退出。 using System; using System.IO; using System.Net.Http; namespace TestHttpClient2 { class Program { /* * Use Yahoo portal to access quotes for stocks – perform asynchronous operations. */ static string baseUrl = “http://real-chart.finance.yahoo.com/”; static string requestUrlFormat = “/table.csv?s={0}&d=0&e=9&f=2015&g=d&a=4&b=5&c=2000&ignore=.csv”; static void Main(string[] args) { while (true) { Console.Write(“Enter a symbol […]

C#如何使用共享的HttpClient传递cookie

我有以下设置: JS客户端 – > Web Api – > Web Api 我需要一直向下发送auth cookie。 我的问题是从一个web api发送到另一个。 由于与使用FormsAuthentication的旧系统集成,我必须传递auth cookie。 出于性能原因,我在以下字典中共享一个HttpClients列表(每个web api一个): private static ConcurrentDictionary _clients = new ConcurrentDictionary(); 所以给定一个标识符,我可以获取相应的HttpClient。 以下工作,但我很确定这是错误的代码: HttpClient client = _clients[identifier]; var callerRequest = HttpContext.Current.Items[“MS_HttpRequestMessage”] as HttpRequestMessage; string authCookieValue = GetAuthCookieValue(callerRequest); if (authCookieValue != null) { client.DefaultRequestHeaders.Remove(“Cookie”); client.DefaultRequestHeaders.Add(“Cookie”, “.ASPXAUTH=” + authCookieValue); } HttpResponseMessage response = […]

.NET HTTPClient异步限制

我有一个小的.Net 4.5 C#应用程序,它从数据源读取信息,然后将此信息推送到一个带有简单控制器的.NET 4.5 Web API站点的网站。 控制器接收数据并将其放入数据库。 以下适用于我,只要应用程序可以读取它就可以写入并且所有内容都在DB中结束: public static void PostDataToWebApi(MyDataClass tData) { HttpResponseMessage s = null; try { s = client.PostAsJsonAsync(“/api/Station/Collector”, tData).Result; s.EnsureSuccessStatusCode(); } catch (Exception e) { Console.WriteLine(“ERROR (ClientPost): ” + e.ToString()); } } 以下不起作用。 它发布了大约一千多条记录,然后在“任务被取消”的消息中出现了一些错误,但是大约10秒后它恢复处理: public static async void PostDataToWebApi(MyDataClass tData) { HttpResponseMessage s = null; try { s = await […]

在直接从调用另一个库返回任务的库中使用ConfigureAwait(false)是否有利?

这个问题的后续行动。 我有一个包含许多异步方法的库,可以轻量地包装HttpClient 。 实际上他们只是做了一些设置并直接返回从HttpClient调用返回的Task : public Task DoThingAsyc() { // do some setup return httpClient.DoThingAsync(); } 我在考虑是否将ConfigureAwait(false)添加到这些调用中。 流行的智慧似乎是“是的,总是在图书馆那样做”。 但在这种情况下,它会引入一些(可能是可忽略的)开销,因为ConfigureAwait返回一个ConfiguredTaskAwaitable ,需要将其包装回Task中,以便不更改方法签名。 当然不难编码: public async Task DoThingAsyc() { // do some setup return await httpClient.DoThingAsync().ConfigureAwait(false); } 我的问题是, ConfigureAwait(false)的效率优势是否可能超过此案例中引入的额外开销? 以上哪个例子被认为是更好的做法?

在Mono上使用自定义SSL客户端证书System.Net.HttpClient

我正在使用NuGet的Microsoft HTTP客户端库 ,我基本上试图在HttpClient中使用X509Certificate2证书进行TLS身份validation。 我试过像这样创建客户端: WebRequestHandler certHandler = new WebRequestHandler () { ClientCertificateOptions = ClientCertificateOption.Manual, UseDefaultCredentials = false }; certHandler.ClientCertificates.Add (this.ClientCertificate); HttpClient client = new HttpClient (certHandler); 但是, certHandler.ClientCertificates失败,因为此getter 未在Mono中实现 ,因此我从中获得了NotImplementedException。 (我不确定为什么那仍然是TODO。) 到目前为止,我运气不好。 任何想法如何在Mono环境中简单地在HttpClient上设置客户端证书?

HttpClient和ReadAsAsync ()扩展方法

所以我正在启动一个新的.Net 4.0项目,并将使用公共API进行一些工作。 我打算使用Microsoft HttpClient类,所以我安装了最新的稳定版Microsoft.Net.Http NuGet包(版本2.2.13)。 我正在查看同事放在一起的一些POC代码,也使用HttpClient的NuGet包,并注意到这样的代码: HttpClient client = new HttpClient(); HttpResponseMessage response = client.GetAync(“/uri”).Result; DomainType result = response.Content.ReadAsAsync().Result; 在我的项目中,在添加对Microsoft.Net.Http包的引用之后,当我尝试编写类似的代码时,我注意到HttpResponseMessage没有ReadAsAsync()方法。 在对我的同事的POC解决方案进行一些挖掘后,看起来ReadAsAsync()实际上是System.Net.Http.Formatting程序集中的扩展方法。 在这个POC解决方案中,有一个对System.Net.Http.Formatting的引用,但它从路径C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Net.Http.Formatting.dll提取此文件C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Net.Http.Formatting.dll 。 我的问题是,有没有比从本地ASP.Net安装引用此程序集更好的解决方案来访问此扩展方法? 我担心这会导致CI服务器出现问题,因为它不太可能安装ASP.Net。 我想我可以将System.Net.Http.Formatting复制到我的解决方案中的Lib目录,但我希望有一个更好的选择,比如我错过的另一个NuGet包会给我这个程序集。 谢谢!

HttpClient和ASP.NET Core 2.0 Web服务之间的连接已关闭错误

我有一个在IIS上运行的ASP.NET Core 2.0 Web服务。 控制器的一种方法或多或少看起来像这样: [HttpGet()] public IActionResult Test() { // do some db updates and get data var result = DoSomeStuff(); // serialize data to byte array var output = Serialize(result); return File(output, “application/octet-stream”); } 它执行一些数据库更新,从表中查询记录,序列化数据并将其作为响应发送。 数据以二进制格式发送。 我正在使用MessagePack-CSharp作为序列化程序。 然后我有客户端应用程序与此Web服务进行通信。 它是.NET Standard 2.0库,从.NET 4.6.1控制台应用程序引用。 我使用HttpClient进行请求,并使用HttpResponseMessage.Content.ReadAsByteArrayAsync()来读取响应(具体代码见下文)。 我想做一些测试。 我的桌子有cca。 80列,包含cca。 140000条记录。 所有这些都应该发送给客户。 从db获取数据需要几秒钟,然后它是序列化的所有内容和cca的结果。 34MB被发送给客户。 我有10个客户。 当他们连续调用webservice时,一切正常。 当我强调web服务和并行启动客户端时,我几乎总是会遇到一些错误(通常有一两个失败,有时甚至是4-5)。 […]

具有无限超时的HttpClient会抛出超时exception

我的HttpClient使用摘要式身份validation连接到服务器,并期望响应搜索查询。 这些搜索查询可以随时进入,因此客户端应始终保持连接处于打开状态。 使用以下代码建立连接: public static async void ListenForSearchQueries(int resourceId) { var url = $”xxx/yyy/{resourceId}/waitForSearchRequest?token=abc”; var httpHandler = new HttpClientHandler { PreAuthenticate = true }; using (var digestAuthMessageHandler = new DigestAuthMessageHandler(httpHandler, “user”, “password”)) using (var client = new HttpClient(digestAuthMessageHandler)) { client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite); var request = new HttpRequestMessage(HttpMethod.Get, url); var tokenSource = new CancellationTokenSource(); tokenSource.CancelAfter(TimeSpan.FromMilliseconds(Timeout.Infinite)); using […]

如何将此.NET RestSharp代码转换为Microsoft.Net.Http HttpClient代码?

我正在试图弄清楚如何使用HttpClient来发布一些简单的参数。 电子邮件 密码 我一直用RestSharp做这个,但我正试图迁移它。 我怎么能用HttpClient做到这一点,好吗? 我有以下RestSharp代码 var restRequest = new RestRequest(“account/authenticate”, Method.POST); restRequest.AddParameter(“Email”, email); restRequest.AddParameter(“Password”, password); 我怎样才能将其转换为使用(Microsoft.Net.Http) HttpClient类呢? 请注意:我正在进行POST 此外,这与PCL组件有关。 最后,我可以添加自定义标头。 说: “ILikeTurtles”, “true” 。