我的客户端代码调用API,我试图从响应头中获取返回的ETag值。如果我使用Fiddler,我可以看到响应包含ETag头,如果我使用Postman进行API调用,我可以查看ETag头。但无论我采取什么方法尝试在代码中检索头,我得到的都是null。
本质上,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);
显示Etag 的Fiddler响应标头
邮差的回应是:;
邮差响应标头
我花了几个小时在网上搜索和尝试例子,但无论我尝试什么,我都无法获得ETag标题。
使用下面的示例代码,我确实得到了前2个标头,如返回的Postman响应标头中所示,但没有得到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()
);
我使用的是Visual Studio、Blazor和aspnetcore 5.0,我希望用IndexDB生成一个PWA,并使用ETag来减少数据下载。
任何关于如何到达埃塔格头球的帮助都将不胜感激。。。
我和其他人一样也有类似的问题。事实上,我们有github问题,并且在这个问题上进行了很好的讨论。我只是想和其他人一样分享,他们可能被困在同一点,并访问堆栈溢出。
问题链接(已关闭(:
https://github.com/dotnet/runtime/issues/42179
引用讨论中的话"您的CORS策略需要指定要公开的标头。如果您希望客户端读取所有标头,则可以将其指定为"so";
示例(服务器端(:
services.AddCors(options =>
{
options.AddPolicy("Open", builder => builder
.AllowAnyOrigin()
.AllowAnyHeader()
.AllowAnyMethod()
.WithExposedHeaders("*")); // this is the important part!
});
我创建了一个非常简单的控制台应用程序,并使用它从API获取数据,我可以看到ETag值在响应中返回,但似乎无法使用响应简单地提取代码中的值。标题等标签
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
namespace SimpleAPIClient
{
class Program
{
private static readonly HttpClient client = new HttpClient();
static async Task Main(string[] args)
{
var request = new HttpRequestMessage(HttpMethod.Get, "https://localhost:44338/api/headers/3");
request.Headers.Authorization = new AuthenticationHeaderValue("bearer", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJhZG1pbkBjb250cmEtc29mdC5jb20iLCJqdGkiOiI4NjgyMmQ1YS1iNTQ3LTRlMjItYmQ3NS0wNDlkZmE5MTMzZmUiLCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1laWRlbnRpZmllciI6IjVkODExZmY1LTgyY2QtNDY2NC05ODkzLTZmNGRjMDU0YzFmNSIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluaXN0cmF0b3IiLCJleHAiOjE2MDgzNTU0MTEsImlzcyI6ImNvbnRyYS1zb2Z0LmNvbSIsImF1ZCI6ImNvbnRyYS1zb2Z0LmNvbSJ9.w_CSstMZkFFn0DcMlcPNNm_Nr0idzHPo6I2hRjEUglQ");
HttpResponseMessage response = await client.SendAsync(request);
var etag = response.Headers.ETag;
int i = 0;
}
}
}
VS断点显示ETag数据
我相信这个问题是由于该项目是一个Blazor Web Assembly项目,如果我创建一个简单的.net核心项目,那么以下代码就可以工作;
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiO");
Task<HttpResponseMessage> s = client.GetAsync("https://localhost:44338/api/headers/3");
HttpResponseMessage nresponse2 = await s;
var etag2 = nresponse2.Headers.FirstOrDefault(i => i.Key == "ETag").Value.FirstOrDefault();
然而Blazor中的相同代码却没有。
在响应消息对象上,您可以直接访问ETag标头。
// 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);
//read the response headers. The ETag is already a "known" header and is easily accessible via a property
EntityTagHeaderValue etagHeader = response.Headers.ETag;