【问题标题】:Get a specific response header (e.g., Content-Disposition) in React from an ASP.NET CORE Web Api从 ASP.NET CORE Web Api 获取 React 中的特定响应标头(例如,Content-Disposition)
【发布时间】: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 读取值并获取文件名?

谢谢大家 干杯

【问题讨论】:

    标签: javascript c# reactjs asp.net-core asp.net-core-webapi


    【解决方案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'));
        

        【讨论】:

          猜你喜欢
          • 2018-05-18
          • 2018-10-30
          • 1970-01-01
          • 1970-01-01
          • 2013-02-10
          • 2010-11-03
          • 2011-12-23
          • 1970-01-01
          • 2017-10-10
          相关资源
          最近更新 更多