如何在 Blazor WASM 客户端中访问 Httpclient 标头

Ste*_*veW 3 c# httpclient response-headers blazor

我的客户端代码调用 API,并且尝试从响应标头获取返回的 ETag 值。如果我使用 Fiddler,我可以看到响应包含 ETag 标头,如果我使用 Postman 进行 API 调用,我可以看到 ETag 标头,但无论我采取什么方法尝试检索代码中的标头,我返回的都是无效的。

API 调用本质上是:

// create request object
var request = new HttpRequestMessage(HttpMethod.Get, url);
// add authorization header
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", await GetBearerToken());
// send request
HttpResponseMessage response = await _client.SendAsync(request);
Run Code Online (Sandbox Code Playgroud)

显示 Etag 的 Fiddler 响应标头

邮递员的回应是;

邮递员响应标头

我花了几个小时搜索并尝试网络上的示例,但无论我尝试什么,我都无法获取 ETag 标头。

使用下面的示例代码,我确实获得了返回的 Postman 响应标头中所示的前 2 个标头,但没有获得 ETag 标头/值。

String allResponseHeaders = Enumerable
    .Empty<(String name, String value)>()
    .Concat(
    response.Headers
    .SelectMany(kvp => kvp.Value
    .Select(v => (name: kvp.Key, value: v))
    ))
    .Concat(
    response.Content.Headers
    .SelectMany(kvp => kvp.Value
    .Select(v => (name: kvp.Key, value: v))
    ))
   .Aggregate(
   seed: new StringBuilder(),
   func: (sb, pair) => sb.Append(pair.name).Append(": ").Append(pair.value).AppendLine(),
   resultSelector: sb => sb.ToString()
   );
Run Code Online (Sandbox Code Playgroud)

我正在使用 Visual Studio、Blazor 和 aspnetcore 5.0,我希望使用 IndexDB 生成 PWA 并使用 ETag 来减少数据下载。

任何有关如何获取 Etag 标头的帮助将不胜感激......

小智 6

我和其他人一样有类似的问题。实际上,我们有 github 问题,并且对此问题进行了广泛的讨论。我只是想与可能陷入同一点并访问堆栈溢出的其他人分享。

问题链接(已关闭):

https://github.com/dotnet/runtime/issues/42179

引用讨论“您的 CORS 策略需要指定公开哪些标头。如果您希望客户端读取所有标头,您可以这样指定”

示例(服务器端):

services.AddCors(options =>
{
    options.AddPolicy("Open", builder => builder
        .AllowAnyOrigin()
        .AllowAnyHeader()
        .AllowAnyMethod()
        .WithExposedHeaders("*")); // this is the important part!
});
Run Code Online (Sandbox Code Playgroud)