标签: dotnet-httpclient

如何在C#中使用带有线程池的HttpClient PostAsync()?

我正在使用以下代码将图像发布到服务器.

var image= Image.FromFile(@"C:\Image.jpg");
Task<string> upload = Upload(image);
upload.Wait();

public static async Task<string> Upload(Image image)
{
    var uriBuilder = new UriBuilder
    {
        Host = "somewhere.net",
        Path = "/path/",
        Port = 443,
        Scheme = "https",
        Query = "process=false"
    };

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.Add("locale", "en_US");
        client.DefaultRequestHeaders.Add("country", "US");

        var content = ConvertToHttpContent(image);
        content.Headers.ContentType = MediaTypeHeaderValue.Parse("image/jpeg");

        using (var mpcontent = new MultipartFormDataContent("--myFakeDividerText--")
            {
                {content, "fakeImage", "myFakeImageName.jpg"}
            }
        )
        {
            using (
                var message = await client.PostAsync(uriBuilder.Uri, mpcontent))
            {
                var input …
Run Code Online (Sandbox Code Playgroud)

.net c# post multithreading dotnet-httpclient

0
推荐指数
1
解决办法
2084
查看次数

如何验证异步到同步方法和 HttpClient.PostAsync 调用中的死锁?

我的程序出现死锁,但我不知道为什么以及如何解决它。

精简版:

一个asynctosync方法锁定等待异步调用,它调用另一个,依此类推,直到HttpClient.PostAsync调用。http post 调用永远不会发生,至少它没有到达服务器(我也拥有)。客户端没有错误。我的主要问题是在这个 SO 问题的末尾。谢谢!

更长的版本:

我知道很容易出现死锁,我们必须小心。我试图坚持 1. 将异步传播到所有方法和 2.ConfigureAwait(false)尽可能使用/有意义的建议。(我认为这一点的主要倡导者是 Stephen Cleary 作为他的博客和我阅读过的许多 SO 中的答案)。

好吧,我的程序……不幸的是,我不能在这里发布完整的示例代码,它很长;我把它描述为一个同步方法A,它调用一个异步方法B,它调用另一个异步,它调用另一个异步,等等。最终最后一个异步调用是HttpClient.PostAsync.

程序停止在await HttpClient.PostAsync。此外,Http post 永远不会触发(我拥有目标服务器,在这种情况下它永远不会收到请求)。(我仔细检查了 uri 等)。

因此,同步方法会锁定等待B的异步任务完成,而这从未发生过。A看起来像这样:

public Byte[] A()
{
var task = BAsync();
return task.GetAwaiter().GetResult();
}
Run Code Online (Sandbox Code Playgroud)

我以这种方式使用同步,因为他的方法不需要返回上下文,我看到斯蒂芬在 Nito 中建议的方法是使用它实现的。(我也尝试过task.Result,但结果相同)。

http post调用的代码是:

private static async Task<HttpResponseMessage> PostAsync(Uri serverUri, HttpContent httpContent)
{
var client = new HttpClient();
return await client.PostAsync(serverUri, …
Run Code Online (Sandbox Code Playgroud)

c# async-await dotnet-httpclient windows-phone-8

0
推荐指数
1
解决办法
1381
查看次数

StringContent 是否与 params(表单数据)相同?

我正在使用以下代码向服务器发布消息。

String credentials="email=me@here.com&pass=abc123";
using (HttpClient client = new HttpClient())
{
  HttpResponseMessage message = await client.PostAsync(
    url, new StringContent(credentials));
  result = await message.Content.ReadAsStringAsync();
}
Run Code Online (Sandbox Code Playgroud)

但是,服务器会回复一条错误消息,指出电子邮件或通行证不存在。

{\"状态\":\"错误\",\"消息\":\"缺少电子邮件或密码\"}

现在,我可以看到它在撒谎,但是可以做些什么呢?我是否没有提供凭据作为发布数据(相当于从 FF 中的 URL 行调用时可以看到的“参数”,如下图所示?

我还注意到,当我访问如下所示的RequestMessage 时,我得到了 URL,没有发送任何凭据。我错过了什么愚蠢的事情?!

result = message.RequestMessage.ToString();
Run Code Online (Sandbox Code Playgroud)

这个结果给了我以下字符串。

方法:POST,RequestUri:'https://server.com/gettoken',版本:1.1,内容:System.Net.Http.StringContent,标题:\u000d\u000a{\u000d\u000a 内容类型:text/plain ; 字符集=utf-8\u000d\u000a 内容长度:56\u000d\u000a}

在此处输入图片说明

c# post dotnet-httpclient

0
推荐指数
1
解决办法
3857
查看次数

UWP 10 C#HttpResponseMessage任务冻结

我从搜索中找不到任何有类似问题的人:

我正在尝试使用HttpClient从服务器获取XML,但我的UI在"task.Wait()"行奇怪地冻结.这是代码:

public void register() {
    String data = "register=" + (accountName) + "&email0=" +
                (email) + "&email1=" + (otherEmail);
    var task = MakeRequest(data);
    task.Wait();                  //freezes here
    var response = task.Result;
    String resultstring = response.Content.ReadAsStringAsync().Result;
}

private static async Task<System.Net.Http.HttpResponseMessage> MakeRequest(String data)
{
     var content = new StringContent(data, Encoding.UTF8, "application/x-www-form-urlencoded");
     var httpClient = new System.Net.Http.HttpClient();
     System.Net.Http.HttpResponseMessage responseMessage=null;
     try
     {
         responseMessage = await httpClient.PostAsync(server, content);
     }
     catch(Exception ex)
     {
         responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
     }
        return responseMessage;
 }
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

c# dotnet-httpclient

0
推荐指数
1
解决办法
468
查看次数

创建 IHttpClientFactory 时如何将参数发送到 services.AddHttpClient 是 Startup.cs?

我正在尝试设置一个 IHttpClientFactory,我想知道如何在创建时向它发送参数,这些参数我需要分配给重试策略。

我正在使用 .Net Core 2.2 和 Microsoft.Extensions.Http.Polly,我已经阅读了这篇文章https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore -2.2

我有这是 Startup.cs

services.AddHttpClient("MyClient", c =>
{
    c.BaseAddress = new Uri("http://interface.net");
    c.DefaultRequestHeaders.Add("Accept", "application/json");
})
.AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(600)));
Run Code Online (Sandbox Code Playgroud)

我是这样用的

private readonly IHttpClientFactory _iHttpClientFactory;

public ValuesController(IHttpClientFactory iHttpClientFactory)
{
    _iHttpClientFactory = iHttpClientFactory;
}

public async Task<ActionResult<string>> Get()
{
    var client = _iHttpClientFactory.CreateClient("MyClient");
    var response = await client.GetAsync("/Service?Id=123");
    response.EnsureSuccessStatusCode();
    var result = await response.Content.ReadAsStringAsync();
    return result;
}

Run Code Online (Sandbox Code Playgroud)

我想知道在执行 CreateClient 时是否有一种方法可以发送参数,以便在 AddTransientHttpErrorPolicy 中分配给 retryCount 和 sleepDuration,在这种情况下分别为 3 和 600,因为我需要创建具有不同 retryCounts 和 sleepDurations 的客户端和这些值可以改变。 …

c# dotnet-httpclient polly asp.net-core

0
推荐指数
1
解决办法
4288
查看次数

使用 HttpClient 将 Zip 文件上传到 ASP.NET Core WebAPI 服务,但 IFormData 参数始终为空

正如标题所说,我正在尝试将 .zip 从我的 WPF 应用程序上传到我的 .NET Core Web API。

经过一些研究,我发现可以使用 MultiPartDataContent 并以这种方式发送它。

将数据发送到服务器的代码如下所示:

            {
                client.BaseAddress = new Uri("http://localhost:62337/");
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                string filepath = @"C:\Users\uic10950\Desktop\Meeting2Text\RecordingApp\bin\mixedaudio.zip";
                string filename = "mixedaudio.zip";

                MultipartFormDataContent content = new MultipartFormDataContent();
                ByteArrayContent fileContent = new ByteArrayContent(System.IO.File.ReadAllBytes(filepath));

                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = filename };
                content.Add(fileContent);

                HttpResponseMessage response = await client.PostAsync("api/transcriptions/recording", content);
                string returnString = await response.Content.ReadAsAsync<string>();
            }
Run Code Online (Sandbox Code Playgroud)

在服务器端,我的控制器操作如下所示:

        public async Task<IActionResult> AddFileToTranscription([FromForm] IFormFile file)
        {
            using (var sr = new StreamReader(file.OpenReadStream()))
            {
                var content = await …
Run Code Online (Sandbox Code Playgroud)

c# wpf dotnet-httpclient asp.net-core-webapi

0
推荐指数
1
解决办法
2417
查看次数

Microsoft 是否有推荐的方法来处理 HttpClient 中标头中的机密?

非常密切相关:如何在没有 SecureString 的情况下保护字符串?

也密切相关:我什么时候需要 .NET 中的 SecureString?

极其密切相关(OP 正在尝试实现非常相似的东西):C# & WPF - Using SecureString for a client-side HTTP API password

.NET Framework 有一个名为SecureString 的类。但是,即使是 Microsoft 也不再建议将其用于新的开发。根据第一个链接的问答,至少有一个原因是该字符串无论如何都会以明文形式存在于内存中至少一段时间(即使时间很短)。至少有一个答案还扩展了一个论点,即如果他们无论如何都可以访问服务器的内存,那么实际上安全性无论如何都可能会被击中,所以它不会帮助你。(第二个链接的问答暗示甚至讨论过将其从 .NET Core 中完全删除)。

话虽如此,微软的文档SecureString不建议更换,并且关于链接问答的共识似乎是这种措施无论如何都不会那么有用。

我的应用程序是一个 ASP.NET Core 应用程序,它广泛使用了对使用HttpClient该类的外部供应商的 API 调用。在通常推荐的最佳做法HttpClient是使用单个实例,而不是每个调用创建一个新的实例。

但是,我们的供应商要求所有 API 调用都包含我们的 API 密钥作为具有特定名称的标头。我目前安全地存储密钥,在 中检索它Startup.cs,并将其添加到我们HttpClient实例的标头中。

不幸的是,这意味着我的 API 密钥将在应用程序的整个生命周期中以明文形式保存在内存中。我发现这对于服务器上的 Web 应用程序来说尤其令人不安;尽管服务器由企业 IT 维护,但我一直被教导将企业网络视为半敌对环境,在这种情况下,不要纯粹依赖企业防火墙来确保应用程序安全。

对于此类情况,Microsoft 是否有推荐的最佳实践?这是他们反对使用的建议的潜在例外SecureString吗?(具体如何工作是一个单独的问题)。或者其他问答中的答案是否真的正确说我不应该担心像这样存在于内存中的明文字符串?

注意:根据对这个问题的回答,我可能会发布一个关于是否可以将类似的内容SecureString用作HttpClient标题的一部分的后续问题。或者我是否必须做一些棘手的事情,例如在使用之前填充标题,然后立即将其从内存中删除?(虽然这会给并发调用带来绝对的噩梦)。如果人们认为我应该做这样的事情,我很乐意为此创建一个新问题。

security encryption dotnet-httpclient .net-core asp.net-core

0
推荐指数
1
解决办法
281
查看次数

如何在 C# 中添加超时并重试 url 调用?

我有一个.tgz文件,我需要下载一个Testing文件夹内的 url 。我可以.tgz使用 .url 从 url 成功下载文件WebClient

下面是我的代码:

private void DownloadTGZFile(string url, string fileToDownload)
{
    using (var client = new WebClient())
    {
        client.DownloadFile(url + fileToDownload, "Testing/configs.tgz");
    }
}
Run Code Online (Sandbox Code Playgroud)

我想看看如何为这个调用添加超时,以便如果 url 在特定时间内没有响应,那么它应该超时但它可以重试 3 次然后放弃。另外我想看看我如何HttpClient在这里使用而不是WebClient考虑它是一个较旧的 BCL 类而不推荐。

c# dotnet-httpclient polly

0
推荐指数
1
解决办法
643
查看次数

如何使用HttpClient发送Ajax请求

我有一个网站发送Ajax请求来检查数字的验证.我希望使用HttpClient在我的WPF应用程序中发送该请求.

它使用post方法,这里是请求url:http://sim.mci.ir/chk-number-availability

这是标题:

Accept: */*
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.5
Cache-Control: no-cache
Connection: keep-alive
Content-Length: 18
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Cookie: _ga=GA1.2.589400539.1410935105; JSESSIONID=33719B6BDA36C7C23A96B5E73F602B08; _gat=1
Host: sim.mci.ir
Pragma: no-cache
Referer: http://sim.mci.ir/first-step
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0
X-Requested-With: XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)

这是唯一的价值:

number=09122175567
Run Code Online (Sandbox Code Playgroud)

我以常见方式使用SendAsync()和PostAsync()方法,但它不起作用.我认为问题出在请求标题中.

c# dotnet-httpclient

-1
推荐指数
1
解决办法
8807
查看次数

性能问题:.NET HttpClient响应很慢

问题:

我正在使用.NET类HttpClient向端点URL发出请求.

我的代码:

using (HttpClient apiClient1 = new HttpClient())
{
    apiClient.GetAsync(apiUrl).Result;
}
Run Code Online (Sandbox Code Playgroud)

问题已识别:

如果我使用using块,我打开多个连接,导致socketExceptions.

将我的上述代码更改为:

public class RequestController: ApiController
{
    private static HttpClient apiClient = new HttpClient();

    [HttpPost]
    public  dynamic GetWebApiData([FromBody] ParamData params)
    {
           var resultContent = apiClient.GetAsync(apiUrl).Result.Content;
           return Newtonsoft.Json.JsonConvert.DeserializeObject<object>(resultContent.ReadAsStringAsync().Result);
    }
}
Run Code Online (Sandbox Code Playgroud)

使后上面的代码的结果HttpClientstatic如下:

  1. 仅建立一个连接.

  2. 对于每个请求,我正在寻找响应时间减少200毫秒.

我需要的:

我希望通过高速响应以至少50次调用终点来进行并发呼叫.

请帮助我解决这个问题.

c# rest dotnet-httpclient

-1
推荐指数
1
解决办法
416
查看次数

如何重试 401 请求以及 TransientHttpError(5XX 和 408)

当出现 HttpRequestException、5XX 和 408 错误时,下面的代码重试 2 次,并且工作正常。

这里我想重试一下是否有401错误?我们如何通过 Polly 实现这一目标?

 services.AddHttpClient(Options.DefaultName)
            .ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { })
            .AddPolicyHandler(HttpPolicyExtensions.HandleTransientHttpError()
                .WaitAndRetryAsync(2, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))));
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient polly asp.net-core retry-logic

-1
推荐指数
1
解决办法
1015
查看次数