【问题标题】:Is it possible to make HttpClient ignore invalid ETag header in response?是否可以让 HttpClient 忽略无效的 ETag 标头作为响应?
【发布时间】:2017-12-07 08:59:37
【问题描述】:

我正在开发一个应用程序,该应用程序使用HttpClient API 向我无法控制的第三方服务发出 Web 服务请求。根据 HTTP 规范,该服务似乎使用包含无效值的 ETag HTTP 标头响应请求(该值未包含在引号中)。这会导致HttpClient 失败并显示System.FormatException

在这种情况下,我对 ETag 标头不感兴趣,并且希望能够忽略无效值。 是否可以使用HttpClient 做到这一点?

我更喜欢使用HttpClient API 而不是WebClientWebRequest,因为这个特殊的用例需要我使用一个SOCKS 代理,这在使用HttpClient 时要简单得多。

【问题讨论】:

  • 如果创建委托处理程序并删除其中的标头会怎样?

标签: c# web-services .net-core dotnet-httpclient


【解决方案1】:

试试这个:

class Example
{
    static void Main()
    {
        var client = HttpClientFactory.Create(new Handler());
        client.BaseAddress = new Uri("http://www.example.local");
        var r = client.GetAsync("").Result;
        Console.WriteLine(r.StatusCode);
        Console.WriteLine(r.Headers.ETag);
    }
}

class Handler : DelegatingHandler
{
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var headerName = "ETag";
        var r = await base.SendAsync(request, cancellationToken);
        var header = r.Headers.FirstOrDefault(x => x.Key == headerName);
        var updatedValue = header.Value.Select(x => x.StartsWith("\"") ? x : "\"" + x + "\"").ToList();
        r.Headers.Remove(headerName);
        r.Headers.Add(headerName, updatedValue);
        return r;
    }
}

我的回复标题:

HTTP/1.1 200 正常

日期:格林威治标准时间 2013 年 1 月 25 日星期五 16:49:29

FiddlerTemplate:真

内容长度:310

内容类型:图片/gif

ETag:rtt123

【讨论】:

  • 不幸的是,这不起作用。即使委托处理程序执行,对base.SendAsync() 的调用也会失败,并显示与之前相同的FormatException
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多