C# 返回文件结果时出现HTTP错误500

C# 返回文件结果时出现HTTP错误500,c#,asp.net-web-api,asp.net-core,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"); 流的大小变为22kb,但当我导航到api的url时,我会得到一个HTTP

我现在有一个很奇怪的问题。。。我试图从我的web api返回一个文件,但是我得到了一个HTTP错误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,为什么


谢谢。

您忘记将memorystream位置重置为起始位置

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

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

return File(ms, "application/octet-stream");
您还可以避免临时内存流

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);
}

使用您的调试器,这就是它的原因。如果在运行时抛出异常,您只是无法在调试器中捕获它。(我假设您使用的调试器基于“流正在工作,没有抛出错误…”)。确保您正在中断所有CLR异常(CTRL+ALT+E)。请考虑以下事项,将您的流作为HythPrimPosiScript返回,而不是作为文件。在尝试将memorystream发送到客户端之前,需要重置其位置:
ms.position=0。您可以将文档直接写入Request.Body流。返回一个空的结果。@Kalten确实是这个问题,我忘了寻找溪流的起点。你应该回答这个话题还是我应该把它关闭?非常感谢,这个职位成功了!!