Tag: dotnet httpclient

如何从HttpRequestException获取JSON错误消息

我有一种情况,我必须在一个catch语句中提取一个Response( HttpResponseMessage ),但我认为无法完成(在catch中使用await )。 此外,如果我在catch之后执行此操作,则HttpResponseMessage消息将获得“Disposed”。 码: private async void MakeHttpClientPostRequest() { HttpResponseMessage response = null; try { HttpClient httpClient = new HttpClient(); httpClient.Timeout = TimeSpan.FromSeconds(15); HttpContent httpContent = null; if (postJSON != null) { httpContent = new StringContent(postJSON); httpContent.Headers.ContentType = new MediaTypeHeaderValue(“application/json”); } response = await httpClient.PostAsync(url, httpContent); if (response != null) { response.EnsureSuccessStatusCode(); netResults […]

C#中的curl-F等价物

我试图在C#中使用HTTPClient对象向API发送一个post请求。 这是CURL命令: curl -X POST https://zzz.zzz.zzz/yyy -F Key=abcd -F media=@”audio.aac” 我写了以下代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Net.Http; using System.IO; using System.Net.Http.Headers; namespace Speech2Text { class Program { static void Main(string[] args) { curl().Wait(); } static async Task curl() { var client = new HttpClient(); //Create List of KeyValuePairs List<KeyValuePair> […]

HttpResponseMessage.Content.Headers ContentDisposition为null

使用HttpClient下载文件时,我首先下载标题然后下载内容。 下载头文件时,我可以在HttpResponseMessage的Content属性上看到Headers集合,但是当通过Headers上的ContentDisposition访问它时,得到null 为什么会这样? 提琴手显示标题很好…… 码: var responseMessage = await httpClient.GetAsync(uri, HttpCompletionOption.ResponseHeadersRead).ConfigureAwait(continueOnCapturedContext: false); 更新1 看起来这个类遵循RFC 2616中概述的Content-Disposition实现,并且无法处理Content-Disposition实现更新RFC 6266 。 RFC 2616将filename参数值定义为带引号的字符串 ,其中更新RFC 6266仅表明它应该是值 。 RFC 2616语法 content-disposition = “Content-Disposition” “:” disposition-type *( “;” disposition-parm ) disposition-type = “attachment” | disp-extension-token disposition-parm = filename-parm | disp-extension-parm filename-parm = “filename” “=” quoted-string disp-extension-token = token disp-extension-parm = token “=” […]

将C#对象发送到webapi控制器

我正在尝试将C#对象传递给web api控制器。 api配置为存储发布到它的Product类型的对象。 我已经使用Jquery Ajax方法成功添加了对象,现在我试图在C#中获得相同的结果。 我创建了一个简单的控制台应用程序来向api发送Post请求: public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } } static void Main(string[] args) { string apiUrl = @”http://localhost:3393/api/products”; var client = new HttpClient(); client.PostAsJsonAsync(apiUrl, new […]

c#httpclient PostAsJson发送GET请求而不是POST

我正在使用HttpClient发布post请求。 我不回来405方法。 在fiddler中捕获跟踪时,它会以GET而不是POST的forms出现! using (var client = new HttpClient()) { var url = AppSettingsUtil.GetString(“url”); var response = client.PostAsJsonAsync(url, transaction).Result; } 我知道异步/等待问题。 这是一个简化的示例来说明问题。 是否有某种web.config或machine.config设置可能会影响这个? 其他请求(通过RestSharp发送)正确发送post 这是小提琴手捕获的内容。 在fiddler中重新运行跟踪也会返回405(正如预期的那样)。 手动将其切换到POST并从fiddler运行。 另外,也许是因为该方法被切换到GET,在fiddler中没有捕获到的身体,我不得不手动粘贴在JSON中 GET /*URL*/ HTTP/1.1 Content-Type: application/json; charset=utf-8 Host: /*host*/ Connection: Keep-Alive

使用HttpClient和ContinueWith的Paralell.ForEach

我有一个方法尝试从并行的几个URL下载数据,并返回IEnumerable反序列化类型 该方法如下所示: public IEnumerable DownloadContentFromUrls(IEnumerable urls) { var list = new List(); Parallel.ForEach(urls, url => { lock (list) { _httpClient.GetAsync(url).ContinueWith(request => { var response = request.Result; //todo ensure success? response.Content.ReadAsStringAsync().ContinueWith(text => { var results = JObject.Parse(text.Result) .ToObject<IEnumerable>(); list.AddRange(results); }); }); } }); return list; } 在我的unit testing中(我存根_httpClient返回一组已知的文本)我基本上得到了 序列不包含任何元素 这是因为该方法在任务完成之前返回。 如果我在.ContinueWith()调用结束时添加.Wait(),它会通过,但我确定我在这里滥用了API …

使用Httpclient信任自签名证书

我正在尝试通过自签名证书发出失败的Web请求: Client = new HttpClient(); HttpResponseMessage Response = await Client.GetAsync(Uri)//defined elsewhere 这会引发信任失败exception。 我按照这里建议使用httpclienthandler再次尝试使用HttpClient允许不受信任的SSL证书 : var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = ( HttpRequestMessage message, X509Certificate2 cert, X509Chain chain, SslPolicyErrors errors ) =>{return true; };//remove if this makes it to production Client = new HttpClient(handler); 抛出一个未实现exception的系统。 有没有其他方法可以信任自签名证书? 我甚至在提出请求的机器上安装了证书,但没有运气。

为什么不调用Task .Result死锁?

几个月前阅读这篇文章之后,我变得很擅长获取Task的Result ,并且通过ConfigureAwait(false)或Task.Run不断地将所有调用包裹Task.Run 。 但是,由于某种原因,以下代码成功完成: public static void Main(string[] args) { var arrays = DownloadMany(); foreach (var array in arrays); } IEnumerable DownloadMany() { string[] links = { “http://google.com”, “http://microsoft.com”, “http://apple.com” }; using (var client = new HttpClient()) { foreach (var uri in links) { Debug.WriteLine(“Still here!”); yield return client.GetByteArrayAsync(uri).Result; // Why doesn’t this deadlock? } […]

如果我等待我正在执行ReadAsStringAsync()的响应,我应该等待ReadAsStringAsync()吗?

如果我等待我正在执行ReadAsStringAsync()的响应,我应该等待 ReadAsStringAsync()吗? 为了进一步澄清,以下两者之间的区别或正确方法是什么? 它们实际上是一样的吗? var response = await httpClient.GetAsync(“something”); var content = await response.Content.ReadAsStringAsync(); return new AvailableViewingTimesMapper().Map(content); 要么 var response = await httpClient.GetAsync(“something”); var content = response.Content.ReadAsStringAsync(); return new AvailableViewingTimesMapper().Map(content.Result);

HttpClient不能正确序列化XML

在调用HttpClient的扩展方法PostAsXmlAsync ,它会忽略该类的XmlRootAttribute 。 这种行为是个错误吗? 测试 [Serializable] [XmlRoot(“record”)] class Account { [XmlElement(“account-id”)] public int ID { get; set } } var client = new HttpClient(); await client.PostAsXmlAsync(url, new Account())