标签: dotnet-httpclient

如何跨多个请求重用 HTTP 连接?

我正在制作一个应用程序,它不断扫描远程网站以进行任何更改。我正在使用System.Net.Http.HttpClient,但我注意到它可能不支持重用连接。

请求一个接一个地执行,但通常需要大约 250 毫秒才能完成。当我在“重用服务器连接”选项打开的情况下打开 Fiddler 时,它会下降到每个请求 150 毫秒。

我想我配置错误HttpClient,但我在 MSDN 参考中找不到任何可以帮助我解决问题的信息。

c# http fiddler dotnet-httpclient

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

C# httpClient.SendAsync 不发送客户端证书

我有以下代码片段:

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 不发送证书?

c# ssl dotnet-httpclient

5
推荐指数
0
解决办法
1173
查看次数

如何使用 HttpClient 验证 Pardot API

我挣扎了大约一天,试图针对 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)

.net c# authentication dotnet-httpclient pardot

5
推荐指数
0
解决办法
1239
查看次数

HttpClient 不返回 Content-Type

我正在发送一个请求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)

这就是我从外部 Rest 客户端得到的: 在此处输入图片说明

Content-Type并且Content-Disposition失踪了。我怎样才能得到它HttpClient

.net c# dotnet-httpclient

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

System.Net.HttpClient 上传文件抛出:该流不支持并发IO读写操作

我正在开发一个项目,该项目有一些跑步者,每个跑步者都可以同时上传文件。任意地我会得到一个“流不支持并发 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 c# upload multithreading dotnet-httpclient

5
推荐指数
0
解决办法
981
查看次数

使用 Httpclient 进行长轮询

我正在使用 .Net 使用一个 REST API (GET) HttpClient。我想用long polling调用这个 API 。

我有几个问题:

  1. 使用长轮询检索数据的最佳方法是什么?
  2. 这是我的用例 - 我的应用程序将通过长轮询来使用这个 api,并根据结果我将在不同的线程上执行一些操作。根据 long poll get 的新响应,我将中止/完成旧线程并再次在新线程上开始操作。如何使用任务实现这一目标?

c# concurrency multithreading long-polling dotnet-httpclient

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

如何判断 .NET HttpClient 返回的内容是否是 Gzip 压缩的?

我需要从远程 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)

.net c# gzip dotnet-httpclient

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

Webapi 2.0 如何在访问令牌过期时实现刷新 JWT 令牌

我在 Web API 实现方面很新,我创建了一个 Web API 服务以将它与ASP.net web form应用程序以及一些使用HttpClient对象的独立应用程序(C# 控制台/Windows 应用程序)一起使用。

我已经在 web api 中实现了一个基本的 JWT 访问令牌身份验证和过期时间限制,这个身份验证技术工作正常,直到令牌未过期,当令牌过期时 web api 不接受请求,因为令牌已过期!根据身份验证实现,这很好,但我想在 web api 中实现刷新令牌逻辑,以便令牌可以更新/引用,并且客户端应该能够使用 web api 资源。

我搜索了很多,但无法找到刷新令牌逻辑的正确实现。如果有人有正确的方法来处理过期的访问令牌,请帮助我。

以下是我在 asp.net 应用程序中使用 web api 所遵循的步骤。

  1. 在 ASP.net Web 表单登录页面中,我将 Web API 称为“TokenController”,该控制器采用两个参数 loginID 和密码,并返回我存储在会话对象中的 JWT 令牌。

  2. 现在,每当我的客户端应用程序也需要使用 web api 资源时,必须在请求标头中发送访问令牌,同时使用httpclient.

  3. 但是当令牌过期时,客户端无法使用 web api 资源,他必须再次登录并更新令牌!这是我不想要的,用户不应提示再次登录,因为应用程序会话超时时间尚未结束。

如何在不强制用户再次登录的情况下刷新令牌。

如果我下面给出的 JWT 访问令牌实现逻辑不合适或不正确,请告诉我正确的方法。

以下是代码。

网络API

身份验证处理程序

  public class AuthHandler : DelegatingHandler
    {

    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
                CancellationToken cancellationToken)
    {
        HttpResponseMessage …
Run Code Online (Sandbox Code Playgroud)

asp.net webforms c#-4.0 dotnet-httpclient asp.net-web-api2

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

URL 中的 HttpClient 和基本身份验证

我想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 获取凭据并自己设置标头?

.net basic-authentication dotnet-httpclient

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

使用静态 HttpClient 刷新令牌

使用 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)

c# rest dotnet-httpclient

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