从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)
Posted
技术标签:
【中文标题】从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)【英文标题】:Get a specific response header (e.g., Content-Disposition) in React from an ASP.NET CORE Web Api 【发布时间】:2019-12-28 12:23:53 【问题描述】:我正在从WebAPI
控制器返回一个文件。 Content-Disposition
标头值是自动填充的,它还包含我的文件名。
我的后端代码如下所示:
[HttpGet("Download")]
public async Task<ActionResult> Download([FromQuery]CompanySearchObject req)
string fileName = "SomeFileName_" + DateTime.UtcNow.Date.ToShortDateString() + ".csv";
var result = await _myService.GetData(req);
Stream stream = new System.IO.MemoryStream(result);
return File(stream, "text/csv", fileName.ToString());
在我的前端:
exportData(params).then(response =>
console.log(response);
console.log('Response Headers:', response.headers);
const type = response.headers['content-type'];
const blob = new Blob([response.data], type: type, encoding: 'UTF-8' );
//const filename = response.headers['content-disposition'].split('"')[1];
//alert(filename);
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'file.xlsx';
link.click();
link.remove();
);
;
但我正在努力获取这些数据,因为当我在前端执行 console.log 时,我看不到这个.. 正如你所看到的,我记录了响应 console.log('Response Headers:', response.headers);
,但我只看到:
这些数据不应该在某个地方吗?我想知道如何从Content-Disposition
读取值并获取文件名?
谢谢大家 干杯
【问题讨论】:
【参考方案1】:遇到了同样的问题。我的问题是CORS。如果你正在使用它,你需要在你的配置中这样暴露它:
app.UseCors(builder =>
builder.AllowAnyOrigin();
builder.AllowAnyMethod();
builder.AllowAnyHeader();
builder.WithExposedHeaders("Content-Disposition"); // this is the important line
);
【讨论】:
【参考方案2】:我这样做的方法是遍历所有请求标头,直到我匹配我正在寻找的特定标头。
// Headers
private void GetSetCustomHeaders(ref string theUsername, ref string thePassword, ref string theAPIKey)
try
foreach (KeyValuePair<string, IEnumerable<string>> header in this.Request.Headers)
string headerType = header.Key;
string headerTypeUpperTrim = headerType.Trim().ToUpper();
IEnumerable<string> headerValue = header.Value;
string fullHeaderValue = "";
bool isFirstHeaderValue = true;
foreach (string headerValuePart in headerValue)
if (isFirstHeaderValue)
fullHeaderValue = headerValuePart;
isFirstHeaderValue = false;
else
fullHeaderValue = fullHeaderValue + Environment.NewLine + headerValuePart;
if (headerTypeUpperTrim == "USERNAME")
theUsername = fullHeaderValue;
else if (headerTypeUpperTrim == "PASSWORD")
thePassword = fullHeaderValue;
else if (headerTypeUpperTrim == "APIKEY")
theAPIKey = fullHeaderValue;
catch (Exception)
//MessageBox.Show("Error at 'GetSetCustomHeaders'" + Environment.NewLine + Environment.NewLine + ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
在上面的示例代码中,我正在寻找“用户名”、“密码”和“APIKey”。它们作为ref
参数传递,因此如果在此方法中设置它们,它们也会在调用此GetSetCustomHeaders
方法的方法中设置,因为它引用相同的东西。所以当我最初调用这个方法时,我的变量设置为string.Empty
。
希望这有帮助。
【讨论】:
【参考方案3】:对于 Fetch Response Headers,它返回的是一个可迭代的,你必须循环通过 response.headers
而不是 log response.headers object
。
试试下面的代码:
response.headers.forEach(console.log);
console.log(response.headers.get('content-disposition'));
【讨论】:
以上是关于从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)的主要内容,如果未能解决你的问题,请参考以下文章
从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)
如何在 ASP.NET Core Web API 中使用 LINQ 仅从数据库中获取最新的 id?
从 ASP.NET Core Web API 中的控制器访问用户身份
将文件从 ASP.NET Core Web api 发布到另一个 ASP.NET Core Web api