Tag: dotnet httpclient

在.NET 4.5中使用HttpClient进行编码

我正在使用fogbugz XML API消耗一些数据。 此API始终以UTF-8提供数据。 当使用WebClient类发出请求时,我可以设置编码。 例如: var result = new WebClient(); result.Encoding = Encoding.UTF8; 但是HttpClient类怎么样? HttpClient client = new HttpClient(); 我应该使用: client.GetByteArrayAsync(url); …然后将编码中的字节(UTF-8)转换为字符串? 或者有没有办法直接将内容作为UTF-8字符串? using (var client = Connector.GetHttpClient()) { var byteData = await client.GetByteArrayAsync(url); data = Encoding.UTF8.GetString(byteData); } 最后,这里是XML响应的摘录:

带有BaseAddress的HttpClient

我在使用HttpClient和BaseAddress属性调用webHttpBinding WCF端点时遇到问题。 HttpClient的 我创建了一个HttpClient实例,将BaseAddress属性指定为本地主机端点。 GetAsync Call 然后我调用GetAsync方法传递额外的Uri信息。 HttpResponseMessage response = await client.GetAsync(string.Format(“/Layouts/{0}”, machineInformation.LocalMachineName())); 服务端点 [OperationContract] [WebGet(UriTemplate = “/Layouts/{machineAssetName}”, ResponseFormat = WebMessageFormat.Json)] List GetLayouts(string machineAssetName); 问题 我遇到的问题是,BaseAddress的/AndonService.svc部分被截断,因此结果调用转到https://localhost:44302/Layouts/1100-00277而不是https://localhost:44302/AndonService.svc/Layouts/1100-00277导致404 Not Found。 是否有理由在GetAsync调用中截断BaseAddress? 我该如何解决这个问题?

如何使用HttpClient PostAsync计算进度?

在我的Windowsapp store应用程序(c#)中,我需要将MultipartFormDataContent (一些字符串内容和一些文件)上传到服务器并在响应时获取一个巨大的文件。 问题 – 我不能使用BackgroundDownloaders 。 我只能使用一个请求。 我使用HttpClient.PostAsync方法: using (var client = new HttpClient(httpClientHandler)) { using (var content = new MultipartFormDataContent()) { content.Add(…); // prepare all strings and files content try { using (var response = await client.PostAsync(url, content)) { if (response.StatusCode == HttpStatusCode.OK) { var inputBytes = await response.Content.ReadAsByteArrayAsync(); // some operations with […]

如何让System.Net.Http.HttpClient不遵循302重定向?

使用NuGet的HttpClient 。 该应用程序使用client.PostAsync()发送post。 我希望它不要遵循302重定向。 怎么样? 我想我可以按照这个答案中的描述设置AllowAutoRedirect 。 但是如何在PostAsync()调用中使用HttpWebRequest呢?

什么是HttpClient.Timeout和使用WebRequestHandler超时属性之间的区别?

我可以直接用HttpClient.Timeout设置我的HttpClient对象的超时,但我最近读到了WebRequestHandler类,它是HttpClientHandler的衍生物。 WebRequestHandler具有ReadWriteTimeout属性。 当与HttpClient.Timeout一起使用时,这将如何影响请求的操作?

使用MultipartFormDataContent生成错误的Content-Type标头

我有以下代码: private static string boundary = “—-CustomBoundary” + DateTime.Now.Ticks.ToString(“x”); private static async Task PostTest() { string servResp = “”; using (var content = new MultipartFormDataContent(boundary)) { content.Add(new StringContent(“105212”), “case-id”); content.Add(new StringContent(“1/14/2014”), “dateFrom”); content.Add(new StringContent(“1/15/2014”), “dateTo”); HttpClientHandler handler = new HttpClientHandler(); cookieContainer = new CookieContainer(); handler.CookieContainer = cookieContainer; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, “http://somewebsite.com/form”); request.Headers.ExpectContinue = […]

HttpClient检索所有标头

目前,我正在研究API包装器。 如果我发送一个错误的Consumer Key ,服务器将在标题中返回Status为403 Forbidden 。 它还将传递自定义标头。 如何实际检索这些自定义标头? 这是从服务器接收的响应。 Cache-Control: private Date: Wed, 01 May 2013 14:36:17 GMT P3P: policyref=”/w3c/p3p.xml”, CP=”ALL CURa ADMa DEVa OUR IND UNI COM NAV INT STA PRE” Server: Apache/2.2.23 (Amazon) Status: 403 Forbidden X-Error: Invalid consumer key. X-Error-Code: 152 X-Powered-By: PHP/5.3.20 Connection: keep-alive 我需要检索X-Error和X-Error-Code 。 目前,我正在使用HttpClient类来处理请求。 如果我在VS Studio 2012的Quick Watch下看到标题响应,我可以像这样找到它 […]

向标头添加授权

我有以下代码: … AuthenticationHeaderValue authHeaders = new AuthenticationHeaderValue(“OAuth2”, Contract.AccessToken); string result = await PostRequest.AuthenticatedGetData(fullUrl, null, authHeaders); return result; … public static async Task AuthenticatedGetData(string url, FormUrlEncodedContent data, AuthenticationHeaderValue authValue) { HttpClient client = new HttpClient(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(authValue.Parameter); HttpResponseMessage response = await client.PostAsync(new Uri(url), data); response.Content.Headers.ContentType = new MediaTypeHeaderValue(“application/json”); response.EnsureSuccessStatusCode(); string responseBody = await response.Content.ReadAsStringAsync(); […]

如何使用System.Net.HttpClient检索部分响应

我正在尝试使用新的HttpClient类(在.NET 4.5中)从服务器检索部分响应以检查内容。 我需要将检索到的数据大小限制为HTTP请求中内容的前几个字节,以限制带宽使用。 我一直无法做到这一点。 我尝试使用GetAsync(url,HttpCompletionOption.ResponseHeadersRead),然后使用Content.ReadAsStream()尝试只读取标题,然后在一个小块中读取响应流。 我还尝试了GetStreamAsync(),然后用一小块(1000字节)读取内容流。 在这两种情况下,HttpClient似乎都在拉动和缓冲整个HTTP响应,而不仅仅是从流中读取请求的字节数。 最初我使用Fiddler监控数据,但意识到Fiddler实际上可能导致整个内容被代理。 我切换到使用System.Net跟踪(显示): ConnectStream#6044116::ConnectStream(Buffered 16712 bytes.) 这是完整的大小,而不仅仅是读取的1000个字节。 我还对Wireshark进行了双重检查,以确认是否确实通过电线拉出了全部内容。 对于更大的内容(如110k链接),我会在TCP / IP流被截断之前获得大约20k的数据。 我试图读取数据的两种方式: response = await client.GetAsync(site.Url, HttpCompletionOption.ResponseHeadersRead); var stream = await response.Content.ReadAsStreamAsync(); var buffer = new byte[1000]; var count = await stream.ReadAsync(buffer, 0, buffer.Length); response.Close() // close ASAP result.LastResponse = Encoding.UTF8.GetString(buffer); 和: var stream = await client.GetStreamAsync(site.Url); var buffer […]

HttpClient – 发送一批请求

我想迭代一批请求,使用HttpClient类将它们中的每一个发送到外部API。 foreach (var MyRequest in RequestsBatch) { try { HttpClient httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromMilliseconds(5); HttpResponseMessage response = await httpClient.PostAsJsonAsync(string.Format(“{0}api/GetResponse”, endpoint), myRequest); JObject resultResponse = await response.Content.ReadAsAsync(); } catch (Exception ex) { continue; } } 这里的上下文是我需要设置一个非常小的超时值,所以如果响应花费的时间超过了那个时间,我们只需得到“任务被取消”exception并继续迭代。 现在,在上面的代码中,注释这两行: HttpResponseMessage response = await httpClient.PostAsJsonAsync(string.Format(“{0}api/GetResponse”, endpoint), myRequest); resultResponse = await response.Content.ReadAsAsync(); 迭代结束得非常快。 取消注释,然后重试。 这需要很多时间。 我想知道使用await调用PostAsJsonAsync / […]