我正在处理一个应用程序,该应用程序使用HttpClient
API向我无法控制的第三方服务发出Web服务请求。该服务似乎响应具有ETag
HTTP标头的请求,该标头包含根据HTTP规范的无效值(该值未包含在引号中)。这会导致HttpClient
失败并显示System.FormatException
。
在这种情况下,我对ETag
标头不感兴趣,并希望能够忽略无效值。 是否可以使用HttpClient
?
我更愿意使用HttpClient
API而不是WebClient
或WebRequest
,因为这个特殊用例要求我使用SOCKS代理,这在使用{{1}时要简单得多}。
答案 0 :(得分:2)
试试这个:
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 GMT
FiddlerTemplate:True
内容长度:310
内容类型:image / gif
ETag:rtt123