我想使用 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) 我正在尝试使用 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) 我正在使用 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
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 …
我有一个托管在 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) 我有一个 Web Api,它向我发送使用 brotli 压缩的响应,并且我有一个控制台应用程序,它通过向我的 WebApi 请求数据来使用 HttpClient。我需要解压缩 WebApi 发送的数据。
\n\n对于.Net Core 2.2
\n\n启动.cs
\n\n//压缩\xc3\xb3n 服务端响应
\n\nservices.Configure<BrotliCompressionProviderOptions>(opciones =>\n opciones.Level = CompressionLevel.Optimal\n);\n\nservices.AddResponseCompression(opciones =>\n{\n opciones.EnableForHttps = true;\n opciones.Providers.Add<BrotliCompressionProvider>();\n});\nRun Code Online (Sandbox Code Playgroud)\n\n控制台应用程序
\n\nusing (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}\nRun Code Online (Sandbox Code Playgroud)\n\nstrResult 不是 …
我想问一下是否有办法绕过 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) 在 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对象。
我试图让 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) 很难将成功的 Postman 请求转换为 C# 中的成功请求。使用 HttpClient 显示我的代码,但也尝试使用 PostSharp 和 HttpRequest。我正在使用带有密码的本地 pfx 证书文件。
在邮递员中:
发送成功(200)。
使用 HttpClient:
var host = @"https://thehost/service/verb?param1=blah¶m2=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# ×8
.net-core ×2
asp.net-core ×2
asp.net-mvc ×2
api ×1
asp.net ×1
asynchronous ×1
json ×1
openssl ×1
polly ×1
postman ×1
request ×1
retry-logic ×1
timeout ×1
ubuntu ×1