我正在使用ASP.NET MVC的新的WebAPI的网络服务,将成为了二进制文件,主要是.cab和.exe文件.
以下控制器方法似乎有效,这意味着它返回一个文件,但它将内容类型设置为application/json:
public HttpResponseMessage<Stream> Post(string version, string environment, string filetype)
{
var path = @"C:\Temp\test.exe";
var stream = new FileStream(path, FileMode.Open);
return new HttpResponseMessage<Stream>(stream, new MediaTypeHeaderValue("application/octet-stream"));
}
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我正在尝试从我的webapi端点返回一个流,然后通过处理流来清理.
我希望这是正确的方法,但是当然在返回之前处理流.
using(var stream = GetStream()){
var response = new HttpResponseMessage();
response.Content = new StreamContent(stream);
return response;
}
Run Code Online (Sandbox Code Playgroud)
处理流的正确方法是什么?
(由于MSDN没有说明StreamContent或其方法的行为,我的临时解决方案是将流的内容复制到字节数组并返回.)
我目前正在使用ASP.NET Core RC2,我遇到了一些奇怪的结果.所以我有一个MVC控制器,具有以下功能:
public HttpResponseMessage Tunnel() {
var message = new HttpResponseMessage(HttpStatusCode.OK);
message.Content = new StringContent("blablabla", Encoding.UTF8);
message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
message.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue {
NoCache = true
};
return message;
}
Run Code Online (Sandbox Code Playgroud)
如果我用邮递员调用此方法并将Accept标头设置为text plain,我会收到以下回复:
{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [
"text/plain"
]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [
{
"Key": "Cache-Control",
"Value": [
"no-cache"
]
}
], …Run Code Online (Sandbox Code Playgroud) 在类似的问题中,使用此代码可以下载PDF:
我正在使用Controller文件夹中的本地文件(.xlsx,.pdf,.zip)进行测试.
[HttpGet("downloadPDF")]
public FileResult TestDownloadPCF()
{
HttpContext.Response.ContentType = "application/pdf";
FileContentResult result = new FileContentResult
(System.IO.File.ReadAllBytes("Controllers/test.pdf"), "application/pdf")
{
FileDownloadName = "test.pdf"
};
return result;
}
Run Code Online (Sandbox Code Playgroud)
但是当另一个文件?,例如Excel文件(.xlsx)或ZIP文件(.zip)时,测试无法正常工作.
代码:
[HttpGet("downloadOtherFile")]
public FileResult TestDownloadOtherFile()
{
HttpContext.Response.ContentType =
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
FileContentResult result = new FileContentResult(System.IO.File.ReadAllBytes("Controllers/test.xlsx"),
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
{
FileDownloadName = "otherfile"
};
return result;
}
Run Code Online (Sandbox Code Playgroud)
我还使用以下内容类型进行了测试:
获得相同的结果.
哪种方法可以返回任何文件类型?
谢谢你的回答
我之前的问题:如何从ASP.net 5 web api返回文件
我试图返回一个文件作为Web API POST请求的响应.
我正在使用dnx451框架和rc1-final构建.控制器方法:
[HttpPost("")]
public ActionResult Post([FromBody]DocumentViewModel vm)
{
try
{
if (ModelState.IsValid)
{
var Document = _repository.GetDocumentByGuid(vm.DocumentGuid, User.Identity.Name);
var Params = Helper.ClientInputToRealValues(vm.Parameters, Document.DataFields);
var file = Helper.GeneratePdf(Helper.InsertValues(Params, Document.Content));
FileStream stream = new FileStream(file,FileMode.Open);
return File(stream, "application/pdf", "test.pdf");
}
}
catch (Exception ex)
{
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return null;
}
Response.StatusCode = (int)HttpStatusCode.BadRequest;
return null;
}
Run Code Online (Sandbox Code Playgroud)
结果我得到一个名为"response"的文件.将其保存为pdf后,我尝试打开它,它说它已损坏.希望您能够帮助我.我使用Postman作为测试客户端.
谢谢