我正在制作一个应用程序,它不断扫描远程网站以进行任何更改。我正在使用System.Net.Http.HttpClient,但我注意到它可能不支持重用连接。
请求一个接一个地执行,但通常需要大约 250 毫秒才能完成。当我在“重用服务器连接”选项打开的情况下打开 Fiddler 时,它会下降到每个请求 150 毫秒。
我想我配置错误HttpClient,但我在 MSDN 参考中找不到任何可以帮助我解决问题的信息。
我有以下代码片段:
var url ="https://localhost/Sensor/Sensors/Whitelist";
var cerX509 = new X509Certificate2(@"c:\Client.pfx", "PASSWORD");
var messageHandler = new WebRequestHandler();
messageHandler.ClientCertificateOptions = ClientCertificateOption.Manual;
messageHandler.ClientCertificates.Add(cerX509);
var message = new HttpRequestMessage(HttpMethod.Get, url);
var httpClient = new HttpClient(messageHandler);
Run Code Online (Sandbox Code Playgroud)
我想弄清楚为什么当我打电话时我的客户端证书没有被发送到服务器httpClient.SendAsync(message),我收到了 401。
当我用httpClient.GetAsync(url)正在发送的证书替换呼叫时。
我可以控制服务器端代码,当我使用时,httpClient.GetAsync我可以检索证书
X509Certificate2 certificate = request.GetClientCertificate();
Run Code Online (Sandbox Code Playgroud)
当我使用httpClient.SendAsync(message)方法调用request.GetClientCertificate()返回null。
为什么 SendAsync 不发送证书?
我挣扎了大约一天,试图针对 Pardot API 进行身份验证。它不喜欢我尝试发布消息正文的方式。所以我想发布对我有用的解决方案。如果您有任何提示或替代方案,我想听听。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
var url = "https://pi.pardot.com/api/login/version/3";
//(Edit) Shorter way to pass the parameters below
//var postData = new List<KeyValuePair<string, string>>
//{
// new KeyValuePair<string, string>("email", "<value>"),
// new KeyValuePair<string, string>("password", "<value>"),
// new KeyValuePair<string, string>("user_key", "<value>")
//};
var postData = new Dictionary<string, string>
{
{"email", "<value>"},
{"password", "<value>"},
{"user_key", "<value>"}
};
var httpContent = new FormUrlEncodedContent(postData);
using (var client = new HttpClient())
{
HttpResponseMessage response = client.PostAsync(url, httpContent).Result;
if (response.IsSuccessStatusCode)
{ …Run Code Online (Sandbox Code Playgroud) 我正在发送一个请求HttpClient。服务器返回我想返回给客户端的两个标头。我是这样运行的:
using (var client = new HttpClient())
{
var response = await client.GetAsync(DownloadUri + $"?path={path}&fileName={fileName}");
// ...
}
Run Code Online (Sandbox Code Playgroud)
但是在客户端我有 10 个标头,而服务器发送 12 个。这就是我在调试器中得到的response.Headers.ToString():
Transfer-Encoding: chunked
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcQWxleFxEb2N1bWVudHNcdGZzXFVDRktcdnNuXGRldlxMYW5pdC5VQ0ZLLkZpbGUuU2VydmVyXEZpbGUuc3ZjXERvd25sb2Fk?=
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Credentials: true
Cache-Control: private
Date: Mon, 06 Jun 2016 12:19:09 GMT
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Run Code Online (Sandbox Code Playgroud)
Content-Type并且Content-Disposition失踪了。我怎样才能得到它HttpClient?
我正在开发一个项目,该项目有一些跑步者,每个跑步者都可以同时上传文件。任意地我会得到一个“流不支持并发 IO 读或写操作”错误。
我们已经看到它发生在小文件(5Mb~10Mb)和大文件(1Gb~2Gb)上。我们甚至尝试了完全相同的文件,有时我们能够重现它。
我们的设置具有 NTLM 身份验证、自签名证书并使用 OWIN/Katana 自托管。全部使用 .Net 编写。
它只发生在(到目前为止)在虚拟机上,我们还没有使用物理机来解决这个问题,尽管其中一些虚拟机真的很强大
这是我的代码:
客户
public Guid Upload(string filePath, Guid taskId)
{
if (string.IsNullOrEmpty(filePath)) { throw new ArgumentException("Value cannot be empty.", "filePath"); }
var key = Guid.Empty;
var fileInfo = new System.IO.FileInfo(filePath);
using (var fileStream = new System.IO.FileStream(filePath, System.IO.FileMode.Open))
{
var content = new StreamContent(fileStream);
content.Headers.Add("TaskId", taskId.ToString());
content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
content.Headers.ContentDisposition.FileName = fileInfo.Name;
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
content.Headers.ContentLength = fileInfo.Length;
key = HttpClient.PostGet<Guid>(content, "https://localhost:1234/Files/Upload");
}
return key;
}
public T …Run Code Online (Sandbox Code Playgroud) 我正在使用 .Net 使用一个 REST API (GET) HttpClient。我想用long polling调用这个 API 。
我有几个问题:
c# concurrency multithreading long-polling dotnet-httpclient
我需要从远程 URL 下载一些内容,然后还要确定内容是否被压缩(Gzip 或 Deflate)。
我的问题是,当您允许HttpClient执行自动解压缩时,它不会在response.Content.Headers.ContentEncoding属性中返回任何值。如果您不启用自动解压缩,那么它确实会返回正确的值,ContentEncoding但是您会留下一个尚未解压缩的 Gzipped 文档,这是没有用的。
取以下代码:
var handler = new HttpClientHandler()
{
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
using (var client = new HttpClient(handler))
{
client.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate");
client.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
using (var message = new HttpRequestMessage(HttpMethod.Get, new Uri("https://www.twitter.com")))
{
using (var response = await client.SendAsync(message))
{
if (response.IsSuccessStatusCode)
{
string encoding = String.Join(",", response.Content.Headers.ContentEncoding);
string content = await response.Content.ReadAsStringAsync();
}
}
} …Run Code Online (Sandbox Code Playgroud) 我在 Web API 实现方面很新,我创建了一个 Web API 服务以将它与ASP.net web form应用程序以及一些使用HttpClient对象的独立应用程序(C# 控制台/Windows 应用程序)一起使用。
我已经在 web api 中实现了一个基本的 JWT 访问令牌身份验证和过期时间限制,这个身份验证技术工作正常,直到令牌未过期,当令牌过期时 web api 不接受请求,因为令牌已过期!根据身份验证实现,这很好,但我想在 web api 中实现刷新令牌逻辑,以便令牌可以更新/引用,并且客户端应该能够使用 web api 资源。
我搜索了很多,但无法找到刷新令牌逻辑的正确实现。如果有人有正确的方法来处理过期的访问令牌,请帮助我。
以下是我在 asp.net 应用程序中使用 web api 所遵循的步骤。
在 ASP.net Web 表单登录页面中,我将 Web API 称为“TokenController”,该控制器采用两个参数 loginID 和密码,并返回我存储在会话对象中的 JWT 令牌。
现在,每当我的客户端应用程序也需要使用 web api 资源时,必须在请求标头中发送访问令牌,同时使用httpclient.
但是当令牌过期时,客户端无法使用 web api 资源,他必须再次登录并更新令牌!这是我不想要的,用户不应提示再次登录,因为应用程序会话超时时间尚未结束。
如何在不强制用户再次登录的情况下刷新令牌。
如果我下面给出的 JWT 访问令牌实现逻辑不合适或不正确,请告诉我正确的方法。
以下是代码。
网络API
身份验证处理程序
public class AuthHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
HttpResponseMessage …Run Code Online (Sandbox Code Playgroud) 我想HttpClient通过在 URL 中指定用户名和密码来使用HTTP 基本身份验证,如下所示:
var request = new HttpRequestMessage(HttpMethod.Get,
"https://username:password@example.com");
using (var client = new HttpClient()) {
await client.SendAsync(request);
}
Run Code Online (Sandbox Code Playgroud)
但是Authorization,请求中没有发送标头。
有没有办法告诉 HttpClient 支持这一点,还是我必须手动从 URL 获取凭据并自己设置标头?
使用 VS 2017 .Net 4.5.2
我有以下课程
public static class MyHttpClient
{
//fields
private static Lazy<Task<HttpClient>> _Client = new Lazy<Task<HttpClient>>(async () =>
{
var client = new HttpClient();
await InitClient(client).ConfigureAwait(false);
return client;
});
//properties
public static Task<HttpClient> ClientTask => _Client.Value;
//methods
private static async Task InitClient(HttpClient client)
{
//resey headers
client.DefaultRequestHeaders.Clear();
//Set base URL, NOT thread safe, which is why this method is only accessed via lazy initialization
client.BaseAddress = new Uri(ConfigurationManager.AppSettings["baseAddress"]);//TODO: get from web.config? File? DB?
//create new request to …Run Code Online (Sandbox Code Playgroud)