Web API Controller将MemoryStream转换为StreamContent
我有一大堆存储在安全服务器上的图像,其中一些需要在面向世界的门户上显示。 门户网站的服务器位于DMZ内部,允许请求但阻止直接请求进入安全域。 图像使用SOLR编目,可以通过内部(apache?)服务器从http://sofzh.miximages.com/c%23/file.jpg
在我的PhotoController
我可以创建一个WebClient
实例,给它提供url并获取一个MemoryStream
。 如果我尝试使用这个内存流来填充response.content,我会得到一个空响应(每个fiddler)。 如果我使用内存流写入本地文件,然后读取文件(使用FileStream和FileInfo)它“按预期”工作。
我应该能够从MemoryStream
到StreamContent
而无需通过文件系统(不应该)? 但怎么样? StreamContent(stream)
的默认构造函数接受内存流实例而没有编译器错误……但它只是“不起作用”。
HttpResponseMessage response = Request.CreateResponse(); using (WebClient webClient = new WebClient()) { string url = string.Format(PHOTO_GET, filePath); using (MemoryStream memoryStream = new MemoryStream(webClient.DownloadData(url))) { // If these lines are unremarked the stream moves 'through' the file system and works (?!) //memoryStream.Position = 0; //string tempName = @"c:\test\" + Guid.NewGuid().ToString() + ".jpg"; //var fs = new FileStream(tempName, FileMode.OpenOrCreate); //stream.CopyTo(fs); //fs.Close(); //FileInfo fi = new FileInfo(tempName); response.Headers.AcceptRanges.Add("bytes"); response.StatusCode = HttpStatusCode.OK; //response.Content = new StreamContent(fi.ReadStream()); response.Content = new StreamContent(memoryStream); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render"); response.Content.Headers.ContentDisposition.FileName = fileName; response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg");//("application/octet-stream"); response.Content.Headers.ContentLength = memoryStream.Length; } } return response;
通过Fiddler进行测试时,我得到:
[Fiddler] ReadResponse()失败:服务器没有为此请求返回完整的响应。 服务器返回0个字节。
(通过FileStream时,Fiddler会向我显示图像。)
在您的代码中,内存流在将内容传递给响应之前就会被释放。 返回的响应将使用已处理的内存流,因此无需返回,因此fiddler中的0字节。
HttpResponseMessage response = Request.CreateResponse(); using (WebClient webClient = new WebClient()) { string url = string.Format(PHOTO_GET, filePath); var memoryStream = new MemoryStream(webClient.DownloadData(url)); response.Headers.AcceptRanges.Add("bytes"); response.StatusCode = HttpStatusCode.OK; response.Content = new StreamContent(memoryStream); response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("render"); response.Content.Headers.ContentDisposition.FileName = fileName; response.Content.Headers.ContentType = new MediaTypeHeaderValue("image/jpg"); response.Content.Headers.ContentLength = memoryStream.Length; } return response;
- Web Web API中的严格映射(Over-Posting)
- 如何在webapi上传中获取Multipart文件的流?
- 自定义MultipartFormDataStreamProvider上传后,通过WebApi从SQL下载大文件
- ASP.NET Web API 2和部分更新
- webapi,如何使用自定义模型绑定器从POST / PUT操作读取文件
- 使用Directory.Delete()和Directory.CreateDirectory()覆盖文件夹
- 在ASP Web API中指定无效参数时返回错误
- AngularJS使用Asp.net Web API:$ http post返回XMLHttpRequest无法加载:预检的响应具有无效的HTTP状态代码405
- 使用异步任务的Web API 2下载文件