Tag: dotnet httpclient

将客户端证书添加到.net核心Httpclient

我正在玩.Net Core并构建一个利用支付API的API。 需要将客户端证书添加到双向SSL身份validation请求中。 如何使用HttpClient在.Net Core中实现这一目标? 我查看了各种文章,发现HttpClientHandler没有提供添加客户端证书的任何选项。 请指教

重新发送HttpRequestMessage – exception

我想多次发送完全相同的请求,例如: HttpClient client = new HttpClient(); HttpRequestMessage req = new HttpRequestMessage(HttpMethod.Get, “http://example.com”); await client.SendAsync(req, HttpCompletionOption.ResponseContentRead); await client.SendAsync(req, HttpCompletionOption.ResponseContentRead); 第二次发送请求将抛出exception消息: 请求消息已发送。 无法多次发送相同的请求消息。 他们是一种“ 克隆 ”请求的方式,以便我可以再次发送? 我的真实代码在HttpRequestMessage上设置的变量多于上面的例子,变量如header和request方法。

区分超时与用户取消

HttpClient具有内置超时function(尽管全部是异步的,即超时可以被认为是与http请求function正交,因此可以由通用异步实用程序处理,但除此之外)并且当超时启动时,它将抛出TaskCanceledException (包装在AggregateException )。 TCE包含一个等于CancellationToken.None 。 现在,如果我向HttpClient提供我自己的CancellationToken并使用它取消操作在它完成(或超时)之前,我得到完全相同的TaskCanceledException ,再次使用CancellationToken.None 。 是否还有一种方法, 通过仅查看抛出的exception ,找出超时是否取消了请求,而不必让我自己的CancellationToken可以访问检查exception的代码? PS这可能是一个错误,并且CancellationToken错误地修复了CancellationToken.None吗? 在取消使用自定义CancellationToken的情况下,我希望TaskCanceledException.CancellationToken等于该自定义标记。 编辑为了使问题更加清晰,通过访问原始的CancellationTokenSource ,可以很容易地区分超时和用户取消: origCancellationTokenSource.IsCancellationRequested == true 从exception中获取CancellationToken虽然给出了错误的答案: ((TaskCanceledException)e.InnerException).CancellationToken.IsCancellationRequested == false 这是一个最小的例子 ,由于受欢迎的需求: public void foo() { makeRequest().ContinueWith(task => { try { var result = task.Result; // do something with the result; } catch (Exception e) { TaskCanceledException innerException = e.InnerException as TaskCanceledException; bool […]

System.Net.Http.HttpClient vs Windows.Web.Http.HttpClient – 主要区别是什么?

在为Windows开发.NET 4.5桌面应用程序时,我已经习惯使用System.Net.Http.HttpClient进行与后端Web API的所有通信。 我现在正在开发一个Windowsapp store应用,并注意到Windows.Web.Http.HttpClient的存在。 我已经找到了两个客户之间的主要区别但没有运气的信息。 从MSDN我知道我应该开始在我的Windowsapp store应用中使用Windows.Web.Http.HttpClient ,因为可能会从API中删除System.Net.Http.HttpClient : 注意 System.Net.Http和System.Net.Http.Headers命名空间可能在Windows的未来版本中不可用,以供Windowsapp store应用使用。 从Windows 8.1和Windows Server 2012 R2开始,使用Windows.Web.Http命名空间中的Windows.Web.Http.HttpClient和相关的Windows.Web.Http.Headers和Windows.Web.Http.Filters命名空间代替Windows运行时应用程序。 但除了这些信息之外,我很难弄清楚主要区别是什么,使用Windows.Web.Http.HttpClient的主要好处是什么? 它添加了什么,我们还没有进入System.Net.Http.HttpClient ? 非常感谢官方文档支持的答案。

HttpWebRequest对每个主机的2个连接的限制是否适用于HttpClient?

如果每个主机的2个连接的(默认)速率限制适用于System.Net.Http.HttpClient,是否有人确信。 请说明您的信息来源以及是否可以像这样增加此限制,或者是否有更好/更简单的方法。 此外,是否有限制器实施? 例如每分钟40个电话? 有一篇关于在这里使用Reactive Extensions的限制策略的文章,但我想知道是否有一个HttpClient方法来做到这一点。

HttpClient不保存Cookie

我正在使用新的HttpClient来处理我项目的网上冲浪需求; 但是,尽管设置正确,但HttpClient不会将cookie保存到Cookie容器中,并且它始终为EMPTY。 码 private CookieContainer _cookieContainer = new CookieContainer(); private HttpClient HttpClient { get; set; } private HttpClientHandler HttpClientHandler { get; set; } public Initialize() { HttpClientHandler = new HttpClientHandler { AllowAutoRedirect = true, UseCookies = true, CookieContainer = _cookieContainer }; HttpClient = new HttpClient(HttpClientHandler); } public CookieContainer Cookies { get { return _cookieContainer; } […]

使用线程池而不是异步IO的HttpClient.SendAsync?

所以我一直在通过Reflector挖掘HttpClient.SendAsync的实现。 我有意想知道的是这些方法的执行流程,以及确定调用哪个API来执行异步IO工作。 在探索了HttpClient的各种类之后,我在内部看到它使用HttpClientHandler ,它派生自HttpMessageHandler并实现其SendAsync方法。 这是HttpClientHandler.SendAsync的实现: protected internal override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request == null) { throw new ArgumentNullException(“request”, SR.net_http_handler_norequest); } this.CheckDisposed(); this.SetOperationStarted(); TaskCompletionSource source = new TaskCompletionSource(); RequestState state = new RequestState { tcs = source, cancellationToken = cancellationToken, requestMessage = request }; try { HttpWebRequest request2 = this.CreateAndPrepareWebRequest(request); state.webRequest = […]

如何在C#中使用HttpClient发送文件和表单数据

如何使用HttpClient发送文件和表单数据? 我有两种方法来发送文件或表单数据。 但我想像HTML表单一样发送它们。 我怎样才能做到这一点? 谢谢。 这是我的代码: if (openFileDialog1.ShowDialog() == DialogResult.OK) { var client = new HttpClient(); var requestContent = new MultipartFormDataContent(); filename = openFileDialog1.FileName; array = File.ReadAllBytes(filename); var imageContent = new ByteArrayContent(array); imageContent.Headers.ContentType = MediaTypeHeaderValue.Parse(“audio/*”); requestContent.Add(imageContent, “audio”, “audio.wav”); var values = new Dictionary { { “token”, “b53b99534a137a71513548091271c44c” }, }; var content = new FormUrlEncodedContent(values); requestContent.Add(content); […]

如何在c#中使用HttpClient中的凭据?

使用HttpClient类访问Delicious API时,我遇到了一些问题。 我有以下代码: try { const string uriSources = “https://api.del.icio.us/v1/tags/bundles/all?private={myKey}”; using (var handler = new HttpClientHandler { Credentials = new NetworkCredential(“MyUSER”, “MyPASS”) }) { using (var client = new HttpClient(handler)) { var result = await client.GetStringAsync(uriSources); } } } catch (Exception ex) { MessageBox.Show(ex.Message, “ERROR…”, MessageBoxButton.OK); } 运行上面的代码时,我得到以下内容:响应状态代码不表示成功:401(未授权)。 那么,我怎么能得到这个工作? 可能吗? 提前致谢 问候!

使用异步调用时exception处理的良好模式

我想使用Web API,我看到很多人推荐System.Net.Http.HttpClient 。 那很好……但我只有VS-2010,所以我还不能使用async/await 。 相反,我想我可以将Task组合使用到ContinueWith 。 所以我尝试了这段代码: var client = new HttpClient(); client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue(“application/json”)); client.GetStringAsync(STR_URL_SERVER_API_USERS).ContinueWith(task => { var usersResultString = task.Result; lbUsers.DataSource = JsonConvert.DeserializeObject<List>(usersResultString); }); 我的第一个观察是认识到如果URL不可用它不会产生任何错误,但可能会有更多这样的错误…… 所以我试图找到一种方法来处理这种异步调用的exception(特别是对于HttpClient)。 我注意到“任务”有IsFaulted属性和AggregateException可能会被使用,但我不确定如何。 另一个观察是GetStringAsync返回Task ,但GetAsync返回Task 。 后者可能更有用,因为它提供了一个StatusCode 。 您能否共享一个关于如何正确使用异步调用并以良好方式处理exception的模式? 基本的解释也将受到赞赏。