C# 将多个MemoryStream作为HttpResponseMessage返回

C# 将多个MemoryStream作为HttpResponseMessage返回,c#,asp.net-web-api,memorystream,C#,Asp.net Web Api,Memorystream,这篇文章可能是重复的,但我没有在堆栈上找到类似的文章,所以我在这里发布。 我想将MemoryStream列表作为HttpResponseMessage返回。我在一个文件夹中有多个文件,我只想从web api以HttpResponseMessage的形式返回这些文件 public async Task<HttpResponseMessage> GetDicomImage(string FolderName) { try {

这篇文章可能是重复的,但我没有在堆栈上找到类似的文章,所以我在这里发布。 我想将MemoryStream列表作为HttpResponseMessage返回。我在一个文件夹中有多个文件,我只想从web api以HttpResponseMessage的形式返回这些文件

public async Task<HttpResponseMessage> GetDicomImage(string FolderName)
 {
 try
            {


                    var content = new MultipartContent();
                    MemoryStream dataStream = null;
                    filePathInfo = Directory.GetFiles(FolderName);
                    foreach (var dcm in filePathInfo)
                    {
                        var dataBytes = File.ReadAllBytes(dcm);
                        dataStream = new MemoryStream(dataBytes);
                        content.Add(dataStream);
                    }
                    httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK);
                    httpResponseMessage.Content = content;//new StreamContent(dataStream);
                    httpResponseMessage.Content.Headers.ContentDisposition = new System.Net.Http.Headers.ContentDispositionHeaderValue("attachment");
                    //httpResponseMessage.Content.Headers.ContentDisposition.FileName = bookName;
                    httpResponseMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/dicom");         
            }
            catch (Exception ex)
            {
                return new HttpResponseMessage
                {
                    StatusCode = HttpStatusCode.InternalServerError,
                    Content = new StringContent(ex.Message)
                };
            }
 }

这是我的代码,我不明白出了什么问题。我没有为不同的文件获取多个MemoryStream。

您可以使用包中的JsonConvert.Serialized对象处理它,如下所示:

{
    public async Task<HttpResponseMessage> GetDicomImage(string FolderName)
    {
        var content = new MultipartContent();
        var filePathInfo = Directory.GetFiles(FolderName);
        var files = new List<FileData>();
        foreach (var dcm in filePathInfo)
        {
            var fileData = new FileData { Content = File.ReadAllBytes(dcm), Name = Path.GetFileName(dcm) };
            files.Add(fileData);
        }
        content.files = files.ToArray();
        var str = JsonConvert.SerializeObject(content);
        httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, str);

    }
}

public class MultipartContent
{
    public FileData[] files;
}

public class FileData
{
    public byte[] Content;
    public string Name;
}
然而,不需要返回流。返回字节[]和文件名就足够了,以便以后保存文件

然后,您需要读取客户端上的响应内容,并将其反序列化回MultipartContent实例

PS似乎您正在尝试将文件从主机发送到客户端。 这是不安全的,因为客户端定义了用于从中获取文件的路径。即使托管进程没有读取系统文件的权限,这看起来也是一种安全风险。 可能您可以为要在主机端映射的文件夹定义某些代码。 像文档-./文档图像-./图像。应修改GetDicoImage以接受文档图像代码并将代码映射到物理路径。
它将阻止客户端请求c:\文件夹,该文件夹将不会被处理,但可用于DDOS托管服务。

Http消息不能包含二进制数据。必须使用Convert to Base64字符串。我会使用具有二进制模式的FTP。FTP是HTTP的一个子类,用于传输文件。二进制模式下的FTP会自动转换为Base64字符串。感谢您的回复。有好的建议写在帖子里。我在这里得到的错误是httpResponseMessage.Content=JsonConvert.SerializeObjectcontent;无法将类型字符串隐式转换为Httpcontent,因此我已更改代码,如httpResponseMessage=Request.CreateResponseHttpStatusCode.OK,content;这是否正确?@Pritish是的,很好,谢谢。我将更新回答一个问题:如何发送多个memorystream对象。在HttpResponseMessage@Pritish实际上,您应该考虑如何在一个响应中发送多个字节数组。I'v引入了MultipartContent类来保存多个文件的多字节数组。然后使用JsonConvert.serialized对象序列化对象,该对象将多个文件转换为响应。很遗憾,MemoryStream对象无法与http响应一起发送