标签: dotnet-httpclient

System.Net.Http.HttpClient 不包含 DownloadData 的定义

我想使用 web api 获取歌词,但它有一个错误“System.Net.Http.HttpClient”不包含“DownloadData”的定义,并且没有扩展方法“DownloadData”接受类型为“System.Net”的第一个参数。可以找到 Http.HttpClient'(您是否缺少 using 指令或程序集引用?)

这是我的代码

internal static class LyricsFetcher
{
    internal static String GetLyrics(String Artist, String Title)
    {
        byte[] responseData;

        string URL;

        URL = "http://api.metrolyrics.com/v1/search/lyrics/?find=" + Artist + "%20" + Title + "&X-API-KEY=1234567890123456789012345678901234567890";

        HttpClient wClient = new HttpClient();
        responseData = wClient.DownloadData(URL); // error
        UTF8Encoding utf8 = new UTF8Encoding();
        String Lyrics = utf8.GetString(responseData,0,responseData.Length);
        return Lyrics;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient

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

HttpClient.PostAsJsonAsync 内容为空

我正在尝试使用 ASP.net MVC 将复杂的数据类型从一个进程发送到另一个进程。由于某种原因,接收端总是收到空白(零/默认)数据。

我的发送方:

static void SendResult(ReportResultModel result)
{
    //result contains valid data at this point

    string portalRootPath = ConfigurationManager.AppSettings["webHost"];
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(portalRootPath);
    client.DefaultRequestHeaders.Accept.Clear();
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

    HttpResponseMessage resp = client.PostAsJsonAsync("Reports/MetricEngineReport/MetricResultUpdate", result).Result;
    if (!resp.IsSuccessStatusCode) {
    //I've confirmed this isn't happening by putting a breakpoint in here.
    }
}
Run Code Online (Sandbox Code Playgroud)

我的接收方在不同的类中,在本地计算机上的不同进程中运行:

public class MetricEngineReportController : Controller
{
    ...
    [HttpPost]
    public void MetricResultUpdate(ReportResultModel result)
    {
        //this does get called, but
        //all the guids in result are zero …
Run Code Online (Sandbox Code Playgroud)

asp.net-mvc json dotnet-httpclient

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

HttpClient 请求在 asp .net 项目中不起作用

我正在使用 HttpClient 向 api 发出请求。此代码位于与两个附加项目(控制台和 Asp.Net Mvc 项目)共享的类库项目中。当我从控制台项目发出请求时,它工作得很好,但在 asp 项目中,它阻塞了行

using(Stream responseStream = await response.Content.ReadAsStreamAsync()
Run Code Online (Sandbox Code Playgroud)

这是我的请求代码

private async Task<dynamic> ReadJson(string url)
        {
            HttpResponseMessage response = await httpClient.GetAsync(url);

            if (response.StatusCode == System.Net.HttpStatusCode.NoContent)
                throw new RateLimitException();

            if (response.StatusCode == System.Net.HttpStatusCode.Forbidden)
                throw new AccessDeniedException();

            if (response.StatusCode != System.Net.HttpStatusCode.OK)
                throw new Exception("Error: " + response.StatusCode);

            using (Stream responseStream = await response.Content.ReadAsStreamAsync())
            using (StreamReader sr = new StreamReader(responseStream, System.Text.Encoding.UTF8))
            {
                string json = sr.ReadToEnd();
                return JObject.Parse(json);
            }
        }
Run Code Online (Sandbox Code Playgroud)

我正在从控制台和 Asp.Net 项目对方法进行相同的调用。从控制台工作,但 asp .net 项目在读取响应内容时阻止行

api asp.net-mvc request console-application dotnet-httpclient

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

C# httpClient 不返回内容

public const string CloudApi = "https://www.idxhome.com/restServices/cloud-idx/login";
public const string password = "cloudidx";
public const string clientId = "65912";
public async Task<ActionResult> Index()
{
    HttpClient client = new HttpClient();
    client.BaseAddress = new Uri(CloudApi);
    client.DefaultRequestHeaders.Accept.Clear();

    var values = new Dictionary<string, string>
    {
       { "clientId", "cloudidx" },
       { "password", "65912" }
    };

    var content = new FormUrlEncodedContent(values);
    HttpResponseMessage response =  await client.PostAsync(CloudApi,content);

    if (response.IsSuccessStatusCode)
    {
        var responseString = response.Content.ReadAsStringAsync().Result;

        response.Content.ToString();
    }

    client.Dispose();

    return View();
}
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用 HttpWebRequest 和 httpClient。我在这里查看了十几个左右的问题,但没有一个对这种情况有帮助。

我可以使用 PHP 和 Curl …

c# asp.net asynchronous dotnet-httpclient

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

HttpClient 问题,如何重用不同的 URI?

我有一个托管在 Azure(应用程序服务)上的简单 Web 应用程序,它调用两个不同的外部 API。昨天,我们的流量出现了巨大的预期峰值,整个事情崩溃了,我现在意识到这是因为我正在创建和处置 HttpClient 的新实例,如下所示:

var url = "https://www.externalapi.com/someendpoint" +
    "/takethedata.js?" +
    "[form]email=" + visitor.EmailAddress +
    "&[form]name=" + visitor.FirstName + " " + visitor.LastName +
    "&[form]zip=" + visitor.zip +
    "&[form]location=" + city + ", " + state;

using(var handler = new HttpClientHandler())
{
    handler.ClientCertificateOptions = ClientCertificateOption.Manual;
    handler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => true;
    handler.SslProtocols = System.Security.Authentication.SslProtocols.Tls12 |
        System.Security.Authentication.SslProtocols.Tls11 |
        System.Security.Authentication.SslProtocols.Tls;

    using(var client = new HttpClient(handler))
    {
        client.BaseAddress = new Uri(url);
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        HttpResponseMessage response = await …
Run Code Online (Sandbox Code Playgroud)

c# dotnet-httpclient asp.net-core asp.net-core-2.0

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

在 HttpClient 中解压缩 Brotli HttpResponse

我有一个 Web Api,它向我发送使用 brotli 压缩的响应,并且我有一个控制台应用程序,它通过向我的 WebApi 请求数据来使用 HttpClient。我需要解压缩 WebApi 发送的数据。

\n\n

对于.Net Core 2.2

\n\n

启动.cs

\n\n

//压缩\xc3\xb3n 服务端响应

\n\n
services.Configure<BrotliCompressionProviderOptions>(opciones =>\n                opciones.Level = CompressionLevel.Optimal\n);\n\nservices.AddResponseCompression(opciones =>\n{\n    opciones.EnableForHttps = true;\n    opciones.Providers.Add<BrotliCompressionProvider>();\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

控制台应用程序

\n\n
using (var client = new HttpClient(handler)){\n    client.BaseAddress = new Uri(BASE_URL);\n    client.Timeout = new TimeSpan(0, 0, TIMEOUT_SECONDS);\n    HttpRequestHeaders headers = client.DefaultRequestHeaders;\n    headers.Add("X-User", Environment.UserName);\n    headers.Add("Accept-Encoding", "br"); //gzip\n    HttpResponseMessage response = null;\n\n    response = await client.GetAsync($"{requestUrl}");\n    if (response.IsSuccessStatusCode)\n    {\n        string strResult = await response.Content.ReadAsStringAsync();\n        return JsonConvert.DeserializeObject<T>(strResult);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

strResult 不是 …

c# dotnet-httpclient .net-core

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

.NET Core - HTTPClient - Ubuntu 20.04 上的 dh 密钥太小

我想问一下是否有办法绕过 Ubuntu 的安全检查,以便我能够在我的 .NET Core 客户端应用程序中使用一个小密钥来获取网站?我得到了error:141A318A:SSL routines:tls_process_ske_dhe:dh key too small例外。

问题是在 Ubuntu 20.04 中,openSSL 的安全级别设置为2和(目前,希望有人能回答我关于 Ask Ubuntu 的问题)我不知道如何将其设置为较低的值。

使用curlunless--ciphers 'DEFAULT:!DH'参数会发生同样的错误,所以我假设问题的根本原因在于操作系统本身。

我不控制网站的服务器,因此更改其安全设置是不行的。

到目前为止我从 C# 方面尝试过的:

serviceCollection.AddHttpClient<IInterface, IImplementation>()
                             .ConfigureHttpMessageHandlerBuilder(messageHandlerBuilder =>
                             {
                                 messageHandlerBuilder.PrimaryHandler = new HttpClientHandler
                                 {
                                     ServerCertificateCustomValidationCallback = (m, c, ch, e) => true
                                 };
                             });
Run Code Online (Sandbox Code Playgroud)

using var httpClient = new HttpClient();
ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;

var …
Run Code Online (Sandbox Code Playgroud)

c# ubuntu openssl dotnet-httpclient .net-core

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

在默认注入的 IHttpClientFactory 中禁用 SSL 证书验证

在 Startup.cs 中我注入一个IHttpClientFactory服务:

services.AddHttpClient();
Run Code Online (Sandbox Code Playgroud)

然后我可以创建一个新的HttpClient通过

public MyClass(IHttpClientFactory httpClientFactory, IOptions<MyClassOptions> options)
{
    _httpClient = httpClientFactory.CreateClient();
    // ...
}
Run Code Online (Sandbox Code Playgroud)

MyClass进行一些 API 访问;基本 URL 在对象中传递options

为了进行测试,我设置了 API 的虚拟实例,它使用自签名 SSL 证书。不幸的是,该证书被(正确地)识别为无效:

System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
 ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.
Run Code Online (Sandbox Code Playgroud)

如何在工厂层(即直接在ConfigureServices方法中)禁用证书验证?

我发现了这个问题,但它似乎使用了一些自定义HttpClient实现(?),而我想针对默认实现。以下不起作用(DI 选择了错误的构造函数并随后失败):

services.AddHttpClient<IMyClass, MyClass>();
Run Code Online (Sandbox Code Playgroud)

这个答案建议为配置提供一个名称HttpClient,但它传递了一些魔术字符串,我想避免这种情况(MyClass位于设计为也可供其他人使用的类库中)。不传递名称也不起作用,因为AddHttpClient那样只会返回一个IServiceCollection对象。

c# dependency-injection dotnet-httpclient asp.net-core

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

Polly 没有超时

我试图让 Polly 在 3 秒后超时以及返回某些 http 代码时再次尝试。但是,直到 100 秒后 HttpClient 超时后才会超时。

这是我的代码:

private static Polly.Wrap.AsyncPolicyWrap<HttpResponseMessage> GetPolicy()
{
    var timeoutPolicy = Policy.TimeoutAsync(3, Polly.Timeout.TimeoutStrategy.Optimistic);

    var retryPolicy = Policy
        .Handle<HttpRequestException>()
        .OrResult<HttpResponseMessage>(r =>
            r.StatusCode == HttpStatusCode.TooManyRequests ||
            r.StatusCode == HttpStatusCode.ServiceUnavailable ||
            r.StatusCode == HttpStatusCode.Forbidden)
        .WaitAndRetryAsync(3, i => TimeSpan.FromSeconds(3));

    var policy = retryPolicy.WrapAsync(timeoutPolicy);
    return policy;
}
Run Code Online (Sandbox Code Playgroud)

更新

根据要求,这是我使用该策略的代码。

var pollyResponse = await GetPolicy().ExecuteAndCaptureAsync(() =>
      httpClient.SendAsync(GetMessage(HttpMethod.Delete, endpoint))
);
Run Code Online (Sandbox Code Playgroud)

以及生成 HttpRequestMessage 的辅助方法:

private HttpRequestMessage GetMessage<T>(HttpMethod method, string endpoint, T content)
{
    var message = new HttpRequestMessage
    { …
Run Code Online (Sandbox Code Playgroud)

c# timeout dotnet-httpclient polly retry-logic

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

将工作邮递员请求转换为 C# (HttpClient)

很难将成功的 Postman 请求转换为 C# 中的成功请求。使用 HttpClient 显示我的代码,但也尝试使用 PostSharp 和 HttpRequest。我正在使用带有密码的本地 pfx 证书文件。

在邮递员中:

  • 将 PFX 证书添加到客户端证书
  • 授权选项卡有用户名和密码(基本身份验证)
  • 根据上述自动生成授权标头(“Basic <encoded username/password>”)
  • 主体是“{}”

发送成功(200)。

使用 HttpClient:

var host = @"https://thehost/service/verb?param1=blah&param2=1111111";
const string certName = @"C:\Key.pfx";
const string userName = "userName";
const string certPassword = "password1";
const string authPassword = "password2";

var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;

// tried many combinations here
handler.SslProtocols = SslProtocols.Tls | SslProtocols.Tls11 |
                       SslProtocols.Tls12 | SslProtocols.Tls13;

var cert = new X509Certificate2(certName, certPassword);
handler.ClientCertificates.Add(cert);
//not sure if …
Run Code Online (Sandbox Code Playgroud)

c# ssl-certificate dotnet-httpclient postman

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