Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Web API控制器将MemoryStream转换为StreamContent_C#_Asp.net_Stream_Asp.net Web Api2 - Fatal编程技术网

C# Web API控制器将MemoryStream转换为StreamContent

C# Web API控制器将MemoryStream转换为StreamContent,c#,asp.net,stream,asp.net-web-api2,C#,Asp.net,Stream,Asp.net Web Api2,我在安全服务器上存储了大量图像,其中一些图像需要显示在面向世界的门户上。门户的服务器位于DMZ内,DMZ允许请求进入,但阻止直接请求通过安全域。图像使用SOLR进行编目,可以通过内部(apache?)服务器从http://intenalname/folderA/folderAB/file.jpg 在我的光控制器中,我可以创建网络客户端的一个实例,给它一个url并获得一个内存流。如果我尝试使用这个内存流来填充response.content,我会得到一个空响应(每个fiddler)。如果我使用内存

我在安全服务器上存储了大量图像,其中一些图像需要显示在面向世界的门户上。门户的服务器位于DMZ内,DMZ允许请求进入,但阻止直接请求通过安全域。图像使用SOLR进行编目,可以通过内部(apache?)服务器从
http://intenalname/folderA/folderAB/file.jpg

在我的
光控制器
中,我可以创建
网络客户端
的一个实例,给它一个url并获得一个
内存流
。如果我尝试使用这个内存流来填充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;

您是否尝试过将
memoryStream.Position
重置为0,就像您在注释掉的代码中那样?这是我尝试过的许多事情之一…没有乐趣,谢谢,虽然我使用了类似的代码,但返回了我在内存中创建的zip文件。我必须添加一行:memoryStream.Seek(0,SeekOrigin.Begin)@这似乎是正确的。在您的情况下,需要重置指针。