返回文件结果时出现 HTTP ERROR 500

Hay*_*tam 4 c# asp.net-web-api asp.net-core

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

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

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

return File(ms, "application/octet-stream");
Run Code Online (Sandbox Code Playgroud)

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

谢谢你。

Kal*_*ten 7

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

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

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

return File(ms, "application/octet-stream");
Run Code Online (Sandbox Code Playgroud)

您还可以避免临时 MemoryStream

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

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

return new EmptyResult();
Run Code Online (Sandbox Code Playgroud)

或者实现一个自定义的 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);
}
Run Code Online (Sandbox Code Playgroud)