C# 如何使用.NETWebAPI和Windows下载已编辑的word文档 我想做什么

C# 如何使用.NETWebAPI和Windows下载已编辑的word文档 我想做什么,c#,typescript,angular8,asp.net-core-webapi,spire.doc,C#,Typescript,Angular8,Asp.net Core Webapi,Spire.doc,我继承了一个angular项目,对该框架还不熟悉。我正在尝试使用Spire.Doc(免费版本)打开一个启用宏的word文档并编辑该文件,然后将编辑后的文件发送到客户端。我打电话给a。NETCore3WebAPI从一个角度组件通过一个报告服务。我需要向API发送一个ID,打开并编辑word文件,然后将其发送回客户端 我得到了什么 我尝试过的所有改变都产生了不同的结果。使用下面的代码,我可以下载word文档,但是一页的文件现在是54页的随机字符(编码错误?) 我的代码 客户端组件.ts public

我继承了一个angular项目,对该框架还不熟悉。我正在尝试使用Spire.Doc(免费版本)打开一个启用宏的word文档并编辑该文件,然后将编辑后的文件发送到客户端。我打电话给a。NETCore3WebAPI从一个角度组件通过一个报告服务。我需要向API发送一个ID,打开并编辑word文件,然后将其发送回客户端

我得到了什么 我尝试过的所有改变都产生了不同的结果。使用下面的代码,我可以下载word文档,但是一页的文件现在是54页的随机字符(编码错误?)

我的代码 客户端组件.ts

publicCreateForm(){
this.reportService.GetForm(this.clientId);
}
报告.service.ts

GetForm(clientId:string){
设params=new-HttpParams()
.set('clientId',clientId);
this.http.get(environment.apirl+'/Reports/GenerateForm',{params:params,responseType:'blob'})
.订阅(响应=>{
让blob=newblob([response],{type:'application/msword'});
const fileName=“Test Word Document.doc”;
saveAs(blob,文件名);
});
}
ReportsController.cs

[HttpGet(“GenerateReimbursementForm”)]
公共异步任务GenerateForm(int clientId)
{
var loggedInUser=this.GetLoggedInUser(this.\u上下文);
if(!loggedInUser.HasSystemAccess)
返回禁止();
//获取文档
string filename=“Test Word Document.doc”;
string path=path.Combine(
目录。GetCurrentDirectory(),
“文件”,
文件名);
Spire.Doc.Document Doc=新的Spire.Doc.Doc文档(路径);
//做记录的事情
Spire.Doc.Documents.paragration p=Doc.createparagration();
p、 Text=“测试…”;
//从内存中的文档获取流
MemoryStream ms=新的MemoryStream();
doc.SaveToFile(ms,Spire.doc.FileFormat.doc);
ms.Position=0;
//在http响应消息中发送到浏览器
var结果=新的HttpResponseMessage(HttpStatusCode.OK);
结果.含量=新的流量含量(ms);
result.Content.Headers.ContentDisposition=新的ContentDispositionHeaderValue(“附件”);
result.Content.Headers.ContentDisposition.FileName=文件名;
result.Content.Headers.ContentType=新的MediaTypeHeaderValue(“应用程序/八位字节流”);
result.Content.Headers.ContentLength=毫秒长度;
返回结果;
}
我尝试过的事情
  • 不同的word文档-相同的结果
  • 不同的单词类型(docx,docm)-word说它是一个损坏的文件
  • 使用不同的
    类型
    值(所有值都具有相同的结果):
    
    • 斑点
    • application/vnd.openxmlformats-officedocument.wordprocessingml.document
    • 阵列缓冲器
  • 添加
    字符集:utf-8
    类型
    字符串
  • 删除Spire.Doc代码-结果相同
  • 使用
    memoryStream.ToArray()
    从控制器返回
    字节[]
    ,而不是
    HttpResponseMessage
    ——结果相同
  • 在组件代码而不是服务中创建并保存blob-结果相同
  • 使链接按钮重定向到控制器路径并跳过.ts文件-由于路径问题,无法使此方法工作
感谢您的帮助

编辑 通过邮递员发出GET请求时,我收到以下信息:

{“版本”:{“主要”:“1”,“次要”:“1”,“构建”:“-1”,“修订”:“-1”,“主要修订”:-1,“minorRevision”:-1},“内容”:{“标题”:[{“键”:“内容处置”,“值”:[“附件;文件名=\”测试字文档.doc\”]},{“键”:“内容类型”,“值”:[“应用程序/八位组流”]},{“键”:“内容长度”,“值”:[“16384”}],“状态码”:200,“ReasonPhase”:“OK”,“headers”:[],“trailingHeaders”:[],“requestMessage”:null,“isSuccessStatusCode”:true}

如果您直接从HTTP客户端(例如Postman)调用API,会发生什么情况并存储响应字节流并用Word打开它?如果结果正确,则问题在于前端,如果结果不正确,则问题在于后端。无论哪种方式,您都可以提出一个更短、更具体的问题,这可能会更快地吸引答案:)我用get请求的结果更新了我的问题。我不熟悉使用API或Postman,让我知道我是否可以从中获得其他信息。是的,您提供的是一些JSON序列化对象,包括标题。请检查,例如,将响应另存为docx文件,并尝试使用Word打开它,看看它是否与我之前的评论一样正确。或者,除了将其作为响应传递之外se,如果您的环境允许,您还可以将返回的内存流/字节数组的副本存储到新文件中。结果应该是一样的。我在Postman中执行了“发送和下载”,它将JSON对象放置到word文档中而不是原始内容中。这真的很奇怪。当您
ToArray()时会得到什么
NET端的响应内存流?如果它是一个字符串,您可以
Encoding.GetString()
it吗?或者,您可以将它保存到一个文件中吗?