C# 发送HTTP标头后,服务器无法设置内容类型-执行的子请求时出错

C# 发送HTTP标头后,服务器无法设置内容类型-执行的子请求时出错,c#,asp.net-mvc-4,C#,Asp.net Mvc 4,这是我第一次在stackoverflow中提出问题,我知道其他人已经提出了这个问题,但我的问题不同,因为我已经做了其他类似问题的建议,但仍然得到了相同的错误 以下是我在ApicController中的代码: [HttpGet] [Route("GenerateReport")] public IHttpActionResult GenerateReport() { try { byte[] bytes = G

这是我第一次在stackoverflow中提出问题,我知道其他人已经提出了这个问题,但我的问题不同,因为我已经做了其他类似问题的建议,但仍然得到了相同的错误

以下是我在ApicController中的代码:

    [HttpGet]
    [Route("GenerateReport")]
    public IHttpActionResult GenerateReport()
    {
        try
        {
            byte[] bytes = Generate();

            System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;

            response.Clear();
            response.ClearHeaders();
            response.BufferOutput = true;
            response.AppendHeader("Content-Type", "application/pdf");
            response.AppendHeader("Content-Disposition", "attachment;filename=test.pdf;");
            //response.Flush();
            response.BinaryWrite(bytes.ToArray());
            response.End();

            //HttpContext.Current.ApplicationInstance.CompleteRequest();

            return Ok(response);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
它成功地下载了文件,但仍然出错,因为我们有一个现有的代码将应用程序重定向到error.aspx,并从那里显示错误

    void application_Error(object sender, EventArgs e)
    {
        HttpApplication application = (HttpApplication)sender;
        var exception = application.Server.GetLastError();
        if (exception is HttpException)
        {
            HttpException httpEx = (HttpException)exception;
            if (httpEx.GetHttpCode() == 404)
            {
                //application.Server.ClearError();
                //HttpContext.Current.Response.TrySkipIisCustomErrors = true;
                HttpContext.Current.Response.StatusCode = 404;
                //Trace.WriteLine("404 for " + HttpContext.Current.Request.Url);
                //throw new ApplicationException("fadsasdfasdfasdfasf");
                //HttpContext.Current.Server.Transfer("~/Four04.ashx");
                return;
            }
        }
        if (exception is ThreadAbortException)
        {
            if (exception.StackTrace.Contains("System.Web.HttpResponse.Redirect(String url, Boolean endResponse, Boolean permanent)"))
            {
                // ThreadAbortException following a Response.Redirect()
                // Do not bother, it is native
                return;
            }
        }

        LogException(exception.GetExplicitBaseException(),  application.Context);
                       application.Server.Transfer(CoreWebApplication.Current.ErrorPageUrl);

    }

您可以使用以下代码来设置正确的响应。 我相信您会得到错误,因为您正在修改HttpContext响应(但是,不要引用我的话)

感谢:

[HttpGet]
[Route("GenerateReport")]
public HttpResponseMessage GenerateReport()
{
    byte[] bytes = Generate();

    HttpResponseMessage result = new HttpResponseMessage(HttpStatusCode.OK);
    var stream = new MemoryStream(bytes);
    result.Content = new StreamContent(stream);
    result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
    result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
    {
        FileName = "test.pdf"
    };

    return result;
}