Tag: dotnet httpclient

ASP.NET MVC中的HttpClient Singleton实现

在www.asp.net上阅读此博客文章和官方说明后 : HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用。 特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重负载下可用的套接字数量。 这将导致SocketException错误。 我发现我们的代码在每次调用时都处理了HttpClient。 我正在更新我们的代码,以便我们重用HttClient,但我关心的是我们的工具但不是线程安全的。 以下是新代码的当前草案: 对于unit testing,我们为HttpClient实现了一个包装器,消费者调用包装器: public class HttpClientWrapper : IHttpClient { private readonly HttpClient _client; public Uri BaseAddress { get { return _client.BaseAddress; } set { _client.BaseAddress = value; } } public HttpRequestHeaders DefaultRequestHeaders { get { return _client.DefaultRequestHeaders; } } public HttpClientWrapper() { _client = new HttpClient(); } public […]

如何复制HttpContent async和cancelable?

我正在使用HttpClient.PostAsync() ,响应是一个HttpResponseMessage 。 它的Content属性是HttpContent类型,它有一个CopyToAsync()方法。 不幸的是,这是不可取消的。 有没有办法将响应复制到Stream并传递CancellationToken ? 我没有CopyToAsync() ! 如果有解决方法,那就没问题了。 就像读取几个字节一样,检查是否取消,继续阅读等等。 HttpContent.CreateContentReadStreamAsync()方法看起来像是一个候选者。 很遗憾,我选择的个人资料无法使用此function。 还不清楚它是否会一次性读取所有数据并浪费大量内存。 注意:我在PCL中使用这个,目标是WP8,Windows Store 8,.NET 4.5,Xamarin.iOS和Xamarin.Android

如何使用.Net 4.0中包含的HttpClient类将文件上传到IIS Express中运行的Asp.Net MVC 4.0操作

我有一个C / S应用程序。 我使用Asp.Net MVC 4.0实现了服务器,客户端运行在.Net 4.5上。 我在服务器端有一个Controller Action,如下所示: public JsonResult Upload(string arg1, int arg2) { //do something about arg1 and arg2 here … var files = Request.Files; if (files.Count > 0) { foreach(var file in files) { var ms = new MemoryStream(); file.InputStream.CopyTo(ms); //save it to somewhere … } } … } 我创建了一个测试html页面,在浏览器中测试它。 它按预期工作。 […]

使用特定的HttpMessageHandler注入单实例HttpClient

作为我正在开发的ASP.Net核心项目的一部分,我需要从WebApi中与许多不同的基于Rest的API端点进行通信。 为了实现这一点,我使用了许多服务类,每个服务类都实例化一个静态HttpClient 。 基本上,我为WebApi连接的每个基于Rest的端点都有一个服务类。 下面是一个如何在每个服务类中实例化静态HttpClient的示例。 private static HttpClient _client = new HttpClient() { BaseAddress = new Uri(“http://endpointurlexample”), }; 虽然上述方法运行良好,但它不允许对使用HttpClient的服务类进行有效的unit testing。 为了让我能够进行unit testing,我有一个假的HttpMessageHandler ,我想在我的unit testing中用于HttpClient ,而HttpClient是如上所述实例化的,但是我无法将假的HttpMessageHandler作为unit testing的一部分。 HttpClient在服务类中保持整个应用程序中的单个实例(每个端点一个实例)的最佳方法是什么,但允许在unit testing期间应用不同的HttpMessageHandler ? 我想到的一种方法是不使用静态字段来保存服务类中的HttpClient ,而是允许使用单例生命周期通过构造函数注入来注入它,这将允许我使用所需的HttpMessageHandler指定HttpClient在unit testing期间,我想到的另一个选项是使用HttpClient工厂类,它在静态字段中实例化HttpClient ,然后可以通过将HttpClient工厂注入服务类来检索,再次允许使用相关的HttpMessageHandler进行不同的实现在unit testing中返回。 以上都没有感到特别干净,感觉必须有更好的方法吗? 有任何问题,请告诉我。

如何在原始请求包含内容时克隆HttpRequestMessage?

我正在尝试使用此答案中概述的方法克隆请求: https : //stackoverflow.com/a/18014515/406322 但是,如果原始请求具有内容,则会收到ObjectDisposedException。 你如何可靠地克隆HttpRequestMessage?

DelegatingHandler用于WebApi中的响应

我目前正在使用几个委托处理程序(派生自DelegatingHandler类)在发送之前处理请求,例如validation签名等。这一切都非常好,因为我不必在所有调用上复制签名validation(例如)。 我想对来自同一Web请求的响应使用相同的原则。 是否有类似于DelegatingHandler的响应? 在某种程度上,在返回到方法之前捕获响应的方法是什么? 附加信息:我使用HttpClient.PutAsync(…)调用web api

HttpClient(C#)在许多异步请求上失败了吗?

我正在使用HttpClient异步向外部api发出许多请求。 我等待所有请求完成,然后在其他代码中使用响应。 我的问题是,如果我发出太多请求,当我使用Task.WhenAll等待时,我的代码会引发exception。 这段代码最终将并行运行,我的意思是我将同时执行多组这些异步请求(即10组200个异步请求)。 我已经实例化了一个HttpClient,我正在使用.NET 4.5异步/等待修饰符,如下所示: using (var client = new HttpClient()) { // make a list of tasks List<Task> taskList; List replies; for (int i = 0; i < MAX_NUMBER_REQUESTS; i++) { taskList.Add(client.GetAsync(externalUri); } List responses = await Task.WhenAll(taskList); // read each response after they have returned foreach (var response in responses) { var […]

HttpClient爬网导致内存泄漏

我正在进行WebCrawler 实现,但在ASP.NET Web API的HttpClient中遇到了奇怪的内存泄漏。 所以减少版本在这里: [更新2] 我发现了问题,并没有HttpClient泄漏。 看到我的回答。 [更新1] 我添加了dispose没有效果: static void Main(string[] args) { int waiting = 0; const int MaxWaiting = 100; var httpClient = new HttpClient(); foreach (var link in File.ReadAllLines(“links.txt”)) { while (waiting>=MaxWaiting) { Thread.Sleep(1000); Console.WriteLine(“Waiting …”); } httpClient.GetAsync(link) .ContinueWith(t => { try { var httpResponseMessage = t.Result; if (httpResponseMessage.IsSuccessStatusCode) httpResponseMessage.Content.LoadIntoBufferAsync() […]

在调用ReadAsStreamAsync时何时或何时调用HttpResponseMessage?

我使用System.Net.Http.HttpClient进行一些客户端HTTP通信。 我在一个地方得到了所有的HTTP,从其余的代码中抽象出来。 在一个实例中,我希望将响应内容作为流读取,但是流的使用者与HTTP通信发生的位置以及流被打开的情况很好地隔离。 在负责HTTP通信的地方,我正在处理所有的HttpClient内容。 在Assert.IsTrue(stream.CanRead)此unit testing将失败: [TestMethod] public async Task DebugStreamedContent() { Stream stream = null; // in real life the consumer of the stream is far away var client = new HttpClient(); client.BaseAddress = new Uri(“https://www.google.com/”, UriKind.Absolute); using (var request = new HttpRequestMessage(HttpMethod.Get, “/”)) using (var response = await client.SendAsync(request)) { response.EnsureSuccessStatusCode(); //here I […]

HttpClient:如何一次上传多个文件

我正在尝试使用System.Net.Http.HttpClient上传多个文件。 using (var content = new MultipartFormDataContent()) { content.Add(new StreamContent(imageStream), “image”, “image.jpg”); content.Add(new StreamContent(signatureStream), “signature”, “image.jpg.sig”); var response = await httpClient.PostAsync(_profileImageUploadUri, content); response.EnsureSuccessStatusCode(); } 这只发送mulipart / form-data,但我预计会在post中的某个地方使用multipart / mixed。 更新:好的,我到了。 using (var content = new MultipartFormDataContent()) { var mixed = new MultipartContent(“mixed”) { CreateFileContent(imageStream, “image.jpg”, “image/jpeg”), CreateFileContent(signatureStream, “image.jpg.sig”, “application/octet-stream”) }; content.Add(mixed, “files”); var response = […]