Javascript 从ASP.NET核心Web Api获取React中的特定响应头(例如,内容配置)

Javascript 从ASP.NET核心Web Api获取React中的特定响应头(例如,内容配置),javascript,c#,reactjs,asp.net-core,asp.net-core-webapi,Javascript,C#,Reactjs,Asp.net Core,Asp.net Core Webapi,我正在从WebAPI控制器返回一个文件。Content-Disposition标题值将自动填充,其中还包含我的文件名 我的后端代码如下所示: [HttpGet("Download")] public async Task<ActionResult> Download([FromQuery]CompanySearchObject req) { string fileName = "SomeFileName_" + DateTime.UtcNow.Date.ToShortDate

我正在从
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());
}

但我正在努力获取这些数据,因为当我在前端执行console.log时,我看不到这一点。。如您所见,我记录了response
console.log('response Headers:',response.Headers)但我唯一看到的是:

这些数据不应该在某个地方吗?我想知道如何从
内容配置中读取值并获取文件名

谢谢各位
Cheers

对于获取响应标头,它返回的是一个可编辑的,您必须循环通过
响应.Headers
,而不是
日志响应.Headers对象

请尝试以下代码:

response.headers.forEach(console.log);
console.log(response.headers.get('content-disposition'));

我这样做的方式是通过循环遍历所有请求头,直到匹配我要查找的特定头

// 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);
    }
}
//标题
private void GetSetCustomHeaders(参考字符串用户名,参考字符串密码,参考字符串密码)
{
尝试
{
foreach(此.Request.Headers中的KeyValuePair标头)
{
字符串headerType=header.Key;
字符串headerTypeUpperTrim=headerType.Trim().ToUpper();
IEnumerable headerValue=header.Value;
字符串fullHeaderValue=“”;
bool isFirstHeaderValue=true;
foreach(字符串headerValue在headerValue中的部分)
{
如果(isFirstHeaderValue)
{
fullHeaderValue=HeaderValue部分;
isFirstHeaderValue=false;
}
其他的
{
fullHeaderValue=fullHeaderValue+Environment.NewLine+HeaderValue部分;
}
}
如果(headerTypeUpperTrim==“用户名”)
{
用户名=fullHeaderValue;
}
否则如果(headerTypeUpperTrim==“密码”)
{
密码=fullHeaderValue;
}
否则如果(headerTypeUpperTrim==“APIKEY”)
{
theAPIKey=fullHeaderValue;
}
}
}
捕获(例外)
{
//MessageBox.Show(“GetSetCustomHeaders”处的错误+Environment.NewLine+Environment.NewLine+ex.Message,“错误”,MessageBoxButton.OK,MessageBoxImage.Error);
}
}
在上面的示例代码中,我正在查找“用户名”、“密码”和“APIKey”。它们作为
ref
参数传递,因此如果在这个方法中设置它们,它们也会在调用这个
GetSetCustomHeaders
方法的方法中设置,因为它引用相同的东西。因此,当我最初调用此方法时,我的变量设置为
string.Empty


希望这有帮助。

也有同样的问题。我的问题是CORS。如果您正在使用它,则需要在配置中以如下方式公开它:

app.UseCors(builder =>
            {
                builder.AllowAnyOrigin();
                builder.AllowAnyMethod();
                builder.AllowAnyHeader();
                builder.WithExposedHeaders("Content-Disposition"); // this is the important line
            });
app.UseCors(builder =>
            {
                builder.AllowAnyOrigin();
                builder.AllowAnyMethod();
                builder.AllowAnyHeader();
                builder.WithExposedHeaders("Content-Disposition"); // this is the important line
            });