没有“访问控制允许来源”CORS错误仅在使用.NET和Angular下载.PDF文件的方法中

No 'Access-Control-Allow-Origin' CORS error only in method to download .PDF file using .NET and Angular

提问人:guirms 提问时间:10/3/2023 更新时间:10/3/2023 访问量:93

问:

我有一个带有 .NET 7 和 Angular 16 的应用程序,我从客户端到服务器发出了很多请求,一切正常。我的问题发生在我用于下载 PDF 文件的特定方法中。此外,此错误仅发生在生产服务器中。错误说(在 chrome 控制台中):

CORS 策略阻止了从源“http://10.17.40.93:3000”对“http://10.17.40.93:5000/Report/GenerateEggResultsReport”处的 XMLHttpRequest 的访问:请求的资源上不存在“Access-Control-Allow-Origin”标头。

请求工作示例:ᅠᅠᅠᅠᅠᅠ

  • 角度面:
getUserResults(startDate: string): Observable<ResponseBase> {
  const params = new HttpParams()
    .set('startDate', startDate);

  return this.http.get<ResponseBase>(environment.apiUrl + 'Report/getUserResults',
    {
      params,
      headers: { 'LangInfo': this.baseService.currentLanguage.enumValue }
    });
}
  • .NET 端
[HttpGet("GetUserResults")]
public JsonResult GetUserResults(DateTime startDate, DateTime endDate, bool isOptoClass, EShiftType? shiftType)
{
    try
    {
        var eggResults = _machineReportAppService.GetUserResults(startDate, endDate, isOptoClass, shiftType);

        return ResponseBase.StatusReturn(EReturnStatus.Success, eggResults);
    }
    catch (Exception ex)
    {
        var returnStatus = ex.Message == Translator.Translate("NoMachineOperationFound") ? EReturnStatus.CleanLoadedData : EReturnStatus.Error;

        var returnMessage = !ex.Message.IsNullOrEmpty() ? ex.Message : Translator.Translate("ErrorGettingEggResults");

        return ResponseBase.StatusReturn(returnStatus, returnMessage);
    }
}

不起作用的请求示例:

  • 角度面:
generateReportFile(eggResultsReportFileRequest: EggResultsReportFileRequest): Observable<HttpResponse<Blob>> {
  return this.http.post<Blob>(environment.apiUrl + 'Report/GenerateEggResultsReportFile', eggResultsReportFileRequest, {
    observe: 'response',
    responseType: 'blob' as 'json',
    headers: {
      'Access-Control-Allow-Origin': '*',
      'LangInfo': this.baseService.currentLanguage.enumValue
    }
  });
}
  • .NET 端:
[HttpPost("GenerateEggResultsReportFile")]
public IActionResult GenerateEggResultsReportFile(EggResultsReportFileRequest eggResultsReportFileRequest)
{
    try
    {
        CreateLog(eggResultsReportFileRequest);

        var eggResultsReport = _machineReportAppService.GenerateEggResultsReportFile(eggResultsReportFileRequest);

        return File(eggResultsReport.ReportContent, eggResultsReport.ReportExtension);
    }
    catch
    {
        throw new InvalidOperationException(Translator.Translate("ErrorGeneratingReport"));
    }
}
C# .NET Angular TypeScript CORS

评论

1赞 Cee McSharpface 10/3/2023
两个快速的想法:(1)有时,当预检请求因任何原因失败时,曲面错误仍可能报告为CORS错误,尽管它是其他原因。调试服务器端,查找异常。(2) allow-origin 标头是响应标头,而不是请求标头。
0赞 guirms 10/3/2023
谢谢,你的回答让我意识到问题出在服务器端。我希望从现在开始事情会更容易

答:

2赞 Bredo 10/3/2023 #1

我看到您的示例之间的主要区别在于,一个是 GET 请求,另一个是 POST 请求。 GET 和 POST 请求的 CORS 策略不同。

也许这个答案可能会有所帮助:https://stackoverflow.com/a/64714974/11905918