【问题标题】:HTTP ERROR 500 when returning a File result [closed]返回文件结果时出现 HTTP ERROR 500 [关闭]
【发布时间】:2019-02-22 22:52:30
【问题描述】:

我现在遇到了一个非常奇怪的问题...我正在尝试从我的 web api 返回一个文件,但我得到一个 HTTP ERROR 500,即使流正在工作并且代码中没有抛出任何错误.

var doc = DocX.Load(...);
// ...

var ms = new MemoryStream();
doc.SaveAs(ms);
doc.Dispose();

return File(ms, "application/octet-stream");

流大小变为 22kb,但是当我导航到 api 的 url 时,我得到一个 HTTP 500,为什么?

谢谢。

【问题讨论】:

  • 使用你的调试器,它的用途是什么
  • 运行时抛出异常,您只是没有在调试器中捕获它。 (我假设您正在使用基于“流正在工作并且没有引发错误......”的调试器)。确保您正在打破所有 CLR异常(ctrl+alt+e)。
  • 考虑按照此将您的流作为 HttpResponseMessage 而不是作为文件返回? stackoverflow.com/questions/26038856/…
  • 您需要重置内存流的位置,然后再尝试将其发送到客户端:ms.Position = 0;。您可以将文档直接写入 Request.Body 流。并返回一个 EmptyResult。
  • @Kalten 确实是这个问题,我忘了寻找流的开头。你应该回答这个话题还是我应该关闭它?。

标签: c# asp.net-web-api asp.net-core


【解决方案1】:

您忘记将内存流位置重置为开头。

var doc = DocX.Load(...);
// ...

var ms = new MemoryStream();
doc.SaveAs(ms);
doc.Dispose();
ms.Position = 0;

return File(ms, "application/octet-stream");

你也可以避免临时的 MemoryStream

var doc = DocX.Load(...);
// ...

doc.SaveAs(Request.Body);
doc.Dispose();

return new EmptyResult();

或者实现一个自定义的ActionResult

public class DocXResult : IActionResult
{
    private DocX _doc;

    public DocXResult(DocX doc) { _doc = doc); }

    public Task ExecuteResultAsync(ActionContext context)
    {
        var response = context.HttpContext.Response;
        response.ContentType = "application/octet-stream";
        _doc.SaveAs(response.Body);

        return Task.CompletedTask;
    }
}

public IActionResult SendDocX()
{
    DocX doc = null; // do your stuff
    this.Response.RegisterForDispose(doc);
    return new DocXResult(docX);
}

【讨论】:

  • 非常感谢,这个位置成功了!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-13
  • 1970-01-01
  • 2017-03-10
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
  • 2021-06-18
相关资源
最近更新 更多