- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试让我的 ASP.Net 5 MVC 6 WebAPI 项目输出一个文件,以响应 HttpGET 请求。
该文件来自 Azure 文件共享,但它可以是包含二进制文件的任何流。
在我看来,MVC 序列化响应对象,并返回结果 JSON,而不是返回响应对象本身。
这是我的 Controller 方法:
[HttpGet]
[Route("GetFile")]
public HttpResponseMessage GetFile(string Username, string Password, string FullName)
{
var client = new AzureFilesClient.AzureFilesClient(Username, Password);
Stream azureFileStream = client.GetFileStream(FullName).Result;
var fileName = Path.GetFileName(FullName);
using (HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK))
{
response.Content = new StreamContent(azureFileStream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileName = fileName };
return response;
}
}
AzureFilesClient 上的 GetFileStream 方法位于此处,尽管流源可以是包含二进制文件内容的任何内容:
public async Task<Stream> GetFileStream(string fileName)
{
var uri = new Uri(share.Uri + "/" + fileName);
var file = new CloudFile(uri, credentials);
using (var stream = new MemoryStream())
{
await file.DownloadToStreamAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
}
编辑:以下是 JSON 响应的示例:
{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [
"application/octet-stream"
]
},
{
"Key": "Content-Disposition",
"Value": [
"attachmentx; filename=\"samplefile.docx\""
]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [],
"RequestMessage": null,
"IsSuccessStatusCode": true
}
最佳答案
经过阅读文档以及一些尝试和错误,问题已经解决。
Azure 部分是使用 nuGet 包“WindowsAzure.Storage”(4.4.1-预览版)制作的
首先是 JSON 序列化的输出。这需要返回自定义操作结果。
using Microsoft.AspNet.Mvc;
using System.IO;
using System.Threading.Tasks;
public class FileResultFromStream : ActionResult
{
public FileResultFromStream(string fileDownloadName, Stream fileStream, string contentType)
{
FileDownloadName = fileDownloadName;
FileStream = fileStream;
ContentType = contentType;
}
public string ContentType { get; private set; }
public string FileDownloadName { get; private set; }
public Stream FileStream { get; private set; }
public async override Task ExecuteResultAsync(ActionContext context)
{
var response = context.HttpContext.Response;
response.ContentType = ContentType;
context.HttpContext.Response.Headers.Add("Content-Disposition", new[] { "attachment; filename=" + FileDownloadName });
await FileStream.CopyToAsync(context.HttpContext.Response.Body);
}
}
现在获取从 Azure 文件共享(或任何其他异步流源)流式传输的二进制数据
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.File;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
public async Task<Stream> GetFileStreamAsync(string fileName)
{
var uri = new Uri(share.Uri + "/" + fileName);
var file = new CloudFile(uri, credentials);
// Note: Do not wrap the stream variable in a Using, since it will close the stream too soon.
var stream = new MemoryStream();
await file.DownloadToStreamAsync(stream);
stream.Seek(0, SeekOrigin.Begin);
return stream;
}
最后是 Controller 代码。请注意 IActionResult 接口(interface)的使用。
[HttpGet]
[Route("GetFile")]
public async Task<IActionResult> GetFile(string username, string password, string fullName)
{
var client = new AzureFilesClient.AzureFilesClient(username, password);
Stream stream = await client.GetFileStreamAsync(fullName);
string fileName = Path.GetFileName(fullName);
return new CustomActionResults.FileResultFromStream(fileName, stream, "application/msword");
}
注意:此示例仅用于 Word 文件,您可能需要考虑将 ContentType 参数设为动态,而不是像这样的静态参数。
关于asp.net - MVC 6 WebAPI 返回序列化的 HttpResponseMessage 而不是文件流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30240468/
在 HttpClient 内部使用语句我需要从某个地方解包 HttpResponseMessage。 using (HttpClient client = new HttpClient()) {
我需要您在以下方面提供帮助。近一个月来,我一直在阅读有关任务和异步的内容。 我想尝试在一个简单的 wep api 项目中实现我新获得的知识。我有以下方法,并且它们都按预期工作: public Htt
var request = new HttpRequestMessage(HttpMethod.Get, $"api/Items"); request.Headers.Accept.Add(new M
我有一个方法接受 Stream 参数并将其传递给服务器 public async Task Execute(Stream archive) { archive.Seek(0,
我有如下服务的 MVC 项目: namespace comp.Services { public class CompService { public HttpClie
我已经验证了将 HttpResponseMessage 作为返回类型的文件设置为“编译”,就像他们在这里所说的:Why I cannot use HttpResponseMessage class?
我正在调用一个返回任务的方法,在调用方法中我需要读取字符串形式的响应。 这是我输入的代码: static public async Task Validate(string baseUri,HttpC
在等待新的 HttpClientFactory 解决 HttpClient 的所有问题时, 我仍然找不到是否应该处理 HttpResponseMessage 和 HttpRequestMessage
为什么要实现这个Web API [HttpGet("hello")] public HttpResponseMessage Hello() { var res = new HttpRespon
我正在编写一个 Web API Controller ,现在我有以下代码: public class PicklistsController : ApiController { private
我收到了 System.Net.Http.HttpResponseMessage> 类型的对象, 我如何获得 List ? 我尝试转换 content 属性并通过其 value 属性从 content
HttpResponseMessage r = new HttpResponseMessage(); r.StatusCode = HttpStatusCode.OK; r.Reaso
我正在尝试在我的 Web api 包装器中编写一个方法。我想利用“异步/等待”功能,这样用户界面就不会被阻塞。下面是 Web API 包装器中的代码片段。 public static asyn
我正在尝试从 .NET Core MVC 应用程序进行简单的 API 调用: using (var client = new HttpClient()) { client.BaseAddres
第一次使用.net的Httpclient,感觉很吃力。我已经设法调用服务器并从它接收响应,但一直停留在从响应中读取。这是我的代码: if (Method == HttpVerb.POST)
我想在 HttpResponseMessage 内容中返回一个文件,如下所示: return Request.CreateResponse(HttpStatusCode.OK, {{a file he
应用程序应该从 LoginUser() 接收到 httpresponsemessage 但它变得没有响应。 private void button1_Click(object sender,
我正在计算我的 C# web api 的性能。我写了一个非常简单的 HelloWorld 响应: public class HelloWorldController : ApiController {
我有一个 DelegatingHandler 的实现,它基本上接受一个请求并将其寻址到另一个服务器 ( http://localhost:9999/test/page.php --> http://o
我一直在开发移动应用程序的后端和前端,但在让我的帖子请求正常工作时遇到了问题。我一直在前端使用 Xamarin.Forms,在后端使用 .Net。 客户端代码: var res = await App
我是一名优秀的程序员,十分优秀!