C# 打开word文档已损坏

C# 打开word文档已损坏,c#,asp.net,office-interop,C#,Asp.net,Office Interop,我正试图将Word文档(在ASP.NET服务器和Microsoft.Office.Interop.Word中生成)发送到客户端,但每次我尝试使用IE9在客户端打开时,它都会说它无法打开,因为它已损坏,但如果我尝试保存并打开它,效果会很好。那么问题出在哪里呢 代码如下: string nombreDoc = @"C:\tempDocs\Test.doc"; generateIndex(nombreDoc); //this is an internal operati

我正试图将Word文档(在ASP.NET服务器和Microsoft.Office.Interop.Word中生成)发送到客户端,但每次我尝试使用IE9在客户端打开时,它都会说它无法打开,因为它已损坏,但如果我尝试保存并打开它,效果会很好。那么问题出在哪里呢

代码如下:

        string nombreDoc = @"C:\tempDocs\Test.doc";
        generateIndex(nombreDoc); //this is an internal operation using Interop.Word
        FileStream sourceFile = new FileStream(nombreDoc, FileMode.Open);
        float FileSize;
        FileSize = sourceFile.Length;
        byte[] getContent = new byte[(int)FileSize];
        sourceFile.Read(getContent, 0, (int)sourceFile.Length);
        sourceFile.Close();
        HttpContext.Current.Response.ClearContent();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.Cache.SetNoServerCaching();
        HttpContext.Current.Response.Buffer = true;
        HttpContext.Current.Response.ContentType = "application/vnd.ms-word.document";
        HttpContext.Current.Response.AddHeader("Content-Length", getContent.Length.ToString());
        HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment; filename=Test.doc");
        HttpContext.Current.Response.BinaryWrite(getContent);
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.End();
        File.Delete(nombreDoc);

我尝试使用WriteFile而不是BynaryWrite,但问题仍然存在。

将内容类型更改为octet stream,并恢复使用WriteFile而不是BinaryWrite

Response.ContentType = "application/octet-stream";

将内容类型更改为八位字节流,并恢复为使用WriteFile而不是BinaryWrite

Response.ContentType = "application/octet-stream";

虽然我的回答可能无法完全回答您的问题,但我遇到了ASP.Net和Office Automation的另一个问题。 我从中学到了不推荐的方法:

我所做的是我制作了一个Windows服务,它用来创建一个Word文档,就像您尝试的那样,并在服务器上创建一个文件。
然后,服务将在数据库中写入文件的路径&ASP.Net页面将发送该文件供下载。基本上,避免通过ASP.Net实现办公自动化,尽管我的回答可能无法完全回答您的问题,但我遇到了ASP.Net的另一个问题&办公自动化。 我从中学到了不推荐的方法:

我所做的是我制作了一个Windows服务,它用来创建一个Word文档,就像您尝试的那样,并在服务器上创建一个文件。

然后,服务将在数据库中写入文件的路径&ASP.Net页面将发送该文件供下载。基本上,避免通过ASP.Net实现办公自动化这通常是因为您的服务器启用了输出压缩。基本上,您的服务器在写入输出流之前尝试GZip二进制文档。Google将向您展示如何验证压缩是否打开,以及如何禁用压缩。

这通常是因为您的服务器启用了输出压缩。基本上,您的服务器在写入输出流之前尝试GZip二进制文档。谷歌将向您展示如何验证压缩是否打开,以及如何禁用压缩。

内容长度是否正确?(尝试将其移除以进行测试)。您是否也gzip了响应文件?(如果是,则内容长度不正确)。(内容长度是您发送的,不需要文件大小)问题仍然存在,不使用内容长度(正如我意识到GZip已启用)。内容长度是否正确?(尝试将其移除以进行测试)。您是否也gzip了响应文件?(如果是,则内容长度不正确)。(内容长度是您发送的,不需要文件大小)问题仍然存在,不使用内容长度(正如我意识到GZip已启用)。问题仍然存在,使用八位字节流:(我在我的一个应用程序中使用了几乎相同的代码,并且它工作正常,因此我接下来将根据@JuannStrauss的答案查看服务器设置。祝你好运!使用八位字节流仍然存在问题:(我在我的一个应用程序中使用了几乎相同的代码,并且它工作正常,因此我接下来会根据@JuannStrauss的答案查看服务器设置。祝你好运!出于安全原因,我起初试图避免ASP.NET中的Office Automation,但问题是我找不到任何可以打开HTML文件并根据Headind样式生成TOC(目录)。这就是我最终使用Microsoft.Office.Interop.Word的原因。出于安全原因,我起初尝试在ASP.NET中避免使用Office Automation,但问题是我找不到任何可以打开HTML文件并生成TOC的外部库(目录)基于Headind样式。这就是我最终使用Microsoft.Office.Interop.Word的原因…我尝试在IIS Express上禁用GZIP压缩(因为我现在正在测试)执行以下命令:1-启动命令提示符2-我转到(%programfiles%\IIS Express)3-我执行以下命令:appcmd set config-section:urlCompression/doDynamicCompression:false,我已重试,但问题仍然存在!!那么发生了什么?如果您可以验证它实际上已被禁用,那么它可能不是压缩。虽然压缩通常是问题所在。我已经意识到问题只发生在我E9,如果我尝试在Mozilla Firefox上运行,它运行良好!(没有更改)那么,对于IE用户,我需要考虑什么呢?不确定。如果您知道问题所在以及解决方案,那么对浏览器名称+版本进行简单测试就足够了。在更改了以下行之后,我已经完成了使其在IE9中工作的工作:HttpContext.Current.Response.AddHeader(“内容处置”,“附件;文件名=test.doc”);到HttpContext.Current.Response.AddHeader(“内容处置”,“内联;文件名=Test.doc”);有人能告诉我原因吗?我已尝试在IIS Express上禁用GZIP压缩(因为我现在正在测试),执行以下命令:1-启动命令提示符2-我转到(%programfiles%\IIS Express)3-我执行以下命令:appcmd set config-section:urlCompression/doDynamicCompression:false,我已重试,但问题仍然存在!!那么发生了什么?如果您可以验证它实际上已被禁用,那么它可能不是压缩。虽然压缩通常是问题所在。我已经意识到问题只发生在我E9,如果我尝试在Mozilla Firefox上运行,它运行良好!(没有更改)那么,对于IE用户,我需要考虑什么呢?不确定。如果您知道问题所在以及解决方案,那么对浏览器名称+版本进行简单测试就足够了。在更改了以下行之后,我已经完成了使其在IE9中工作的工作:HttpContext.Current.Response.AddHeader(“内容处置”,“附件;文件名=test.doc”)到HttpContext.Current.Response.AddHeader(“内容处置”,“内联;文件名=Test.doc”);有人能告诉我