Tag: dotnet httpclient

使用HttpClient发布自定义类型

我有一个自定义的dto类: public class myObject { public string Id { get; set; } public string Name { get; set; } } 和一个使用Web Api的控制器(4.5 .net框架) [HttpPost] public IHttpActionResult StripArchiveMailboxPermissions(myObject param) { DoSomething(param); return OK(); } 客户端只有4.0 .net框架所以我将无法使用PostAsJsonAsync()方法。 将对象从我的客户端传递到服务器的解决方案是什么? 我试过像下面这样的东西: var response = Client.SendAsync(new HttpRequestMessage(objectTest)).Result; 但它抛出了我的exception: Could not load file or assembly ‘Microsoft.Json, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35’ or one […]

HttpClient.BaseAddress的目的是什么,为什么我不能在第一次请求后更改它

所以我们大多数人可能已经读过我们应该重用HttpClient实例,而不是using和创建新的实例。 这意味着我可以在我的程序中创建一个HttpClient实例,并使用每个请求使用完整的uri字符串调用GetAsync 。 这导致我进入HttpClient的BaseAddress属性。 请考虑以下代码: HttpClient microsoftClient = new HttpClient() { BaseAddress = new Uri(“https://www.microsoft.com/”) }; HttpClient stackoverflowClient = new HttpClient() { BaseAddress = new Uri(“https://stackoverflow.com/”) }; var response = microsoftClient.GetAsync(“about”).Result; Console.WriteLine($”I {((response.IsSuccessStatusCode) ? “can” : “cannot”)} access microsoft.com/about from the microsoft client”); response = microsoftClient.GetAsync(“trademarks”).Result; Console.WriteLine($”I {((response.IsSuccessStatusCode) ? “can” : “cannot”)} access microsoft.com/trademarks from […]

如何收听保持活跃的HttpResponseMessage直到它关闭?

我正在使用HttpClient向远程Web服务器发送异步POST请求。 该远程Web服务器响应Connection标头设置为keep-alive 。 最终,它将关闭连接。 我无法弄清楚怎么做是继续接收数据,直到连接设置为关闭。 例如,请考虑以下代码: HttpClient client = new HttpClient(); string requestUri = …; //My GET uri string content = …; //url-encoded contents of the request HttpResponseMessage response = await client.PostAsync(requestUri, new StringContent(content)); 在上面的代码中, response将Connection标头设置为keep-alive 。 我找不到HttpResponseMessage上的任何成员似乎在收到第一个keep-alive后给我任何继续接收信息的方法。 在Connection关闭之前,我无法弄清楚如何继续接收响应。 我能够找到处理发送keep-alive请求的各种资源。 那不是我的问题。 我的问题是接收/处理来自服务器的keep-alive响应。 如果我能提供更多信息以便改进这个问题,请告诉我。

async等待执行windows phone 8

我是异步的新手,等待编程风格。 如何解决以下问题: 我先调用下面的代码。 这里的问题是第一行正在等待填充categoriesvm.Categorieslist哪个需要,但它没有,但第二行被调用。 (我认为这是await的默认行为) 如何在第一行填充categoriesvm.Categorieslist时确保仅调用第二行? protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { categoriesvm.GetCategories(); BookCategories.DataContext = from vm in categoriesvm.Categorieslist select vm; } 在上面的代码中,当我执行第一行时,它会进入下面,其中Categorieslist是我上面访问的列表。 public async void GetCategories() { Categorieslist = new ObservableCollection(await PhoneClient.GetDefaultCategories()); } phoneclient在下面 public class PhoneClient { private static readonly HttpClient client; public static Uri ServerBaseUri { get { return new Uri(“http://169.254.80.80:30134/api/”); } […]

在HttpClient中覆盖主机

我正在使用HttpClient,但它有DNS解析的问题(它正在使用同步方法)所以我使用另一个lib进行DNS查询,现在我正在尝试通过IP获取自定义URL但我需要替换Host头。 例如,我有urlhttp://fb.com,但我需要获得http://1.1.1.1主机设置为fb.com我试过: _req = new HttpRequestMessage(HttpMethod.Get, newUri.ToString()); _req.Headers.Host = uri.Host; _httpClient.DefaultRequestHeaders.Host = uri.Host; 但这不起作用。 有没有办法在HttpWebRequest中设置自己的主机头?

在递归函数中使用Async / Await时控制任务总数

我写了这段代码。 它通过进行REST调用以递归方式在Web系统中创建文件夹。 所以基本上,它为根节点创建一个文件夹,然后并行地并递归地调用自己获取所有子节点。 (为每个孩子) 代码唯一的问题是,如果一个节点也有子节点,或者如果层次结构太深,那么我开始得到“TaskCancellation”错误。 我已经尝试将超时增加到10分钟..但这并没有解决问题。 所以我的问题是如何开始说出50个任务,然后等待某些东西被释放,只有当有50个开放槽时才能继续。 目前我认为我的代码正在创建任务,没有任何限制,因为流经层次结构。 public async Task CreateSPFolder(Node node, HttpClient client, string docLib, string currentPath = null) { string nodeName = Uri.EscapeDataString(nodeName); var request = new { __metadata = new { type = “SP.Folder” }, ServerRelativeUrl = nodeName }; string jsonRequest = JsonConvert.SerializeObject(request); StringContent strContent = new StringContent(jsonRequest); strContent.Headers.ContentType = MediaTypeHeaderValue.Parse(“application/json;odata=verbose”); […]

HttpClient与客户端证书一起重用

我已经在几个地方(比如这里 , 这里或这里 )读过, 在请求之后直接处理HttpClient是一种不好的做法,最好在所有请求完成后处理它,以允许重用连接。 为了尝试这一点,我创建了一个HttpClient实例并以这种方式添加到我的类中的静态字段: public class Test { private static X509Certificate2 _certificate; private static HttpClient HttpClient { get; set; } … public Test() { … if (HttpClient == null) { LoadCertificate(); ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; var handler = new WebRequestHandler(); handler.ClientCertificates.Add(_certificate); HttpClient = new HttpClient(handler, false); } } […]

将httpHandler附加到httpclientFactory webapi aspnetcore 2.1

我试图使用“ConfigurePrimaryHttpMessageHandler”将处理程序附加到httpclientfactory 但当我查看HttpClient内部以查看处理程序是否存在时,我无法找到它 我是否正确附加了处理程序? 任何建议 services.AddHttpClient(client => { client.BaseAddress = new Uri(myUri); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); }) .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { AllowAutoRedirect = false, AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip }); public interface IGitHubClient { Task GetData(); } public class GitHubClient : IGitHubClient { private readonly HttpClient _client; public GitHubClient(HttpClient httpClient) { _client = httpClient; } public async […]

死锁从webapi中的异步DelegatingHandler读取异步响应内容

问题 我在WebAPI中使用DelegatingHandler来读取响应内容并将其审核到数据库。 当代码到达.ReadAsStringAsync()时,它似乎锁定并阻止其他请求完成。 我只知道这一点,因为当我删除违规行时,它完美无缺。 public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new ResourceAuditHandler()); } public class ResourceAuditHandler : DelegatingHandler { protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var response = await base.SendAsync(request, cancellationToken); string content = “”; if (response.Content != null) { //THIS SEEMS TO CREATE DEADLOCK! content = await response.Content.ReadAsStringAsync(); } AuditResponseToDatabase(content); return […]

取消对’HttpClient.SendAsync()’的调用

是否可以取消对HttpClient.SendAsync()的调用? 我发送的数据如下: var requestMessage = new HttpRequestMessage(HttpMethod.Post, “some url”); var multipartFormDataContent = new MultipartFormDataContent(); // … construction of the MultipartFormDataContent. It contains form data + picture file requestMessage.Content = multipartFormDataContent; var response = await client.SendAsync(requestMessage).ConfigureAwait(false); 此代码完美无缺,但我需要能够根据用户需求取消请求。 这可能吗? 我看到SendAsync的重载接受了CancellationToken但我不知道如何使用它。 我还知道一个名为IsCancellationRequested的属性,它指示请求是否已被取消。 但是如何实际取消请求?