Web API Controller convertit MemoryStream en StreamContent
J'ai une grande collection d'images stockées sur un serveur sécurisé, dont certains doivent être affichés sur un monde confronté à de portail. Le portail est le serveur est à l'intérieur d'une zone démilitarisée qui permet de demandes, mais empêche les demandes directes de se déplacer à travers domaine sécurisé. Les images sont catalogués à l'aide de SOLR et peut être téléchargé via un interne (apache?) serveur de http://intenalname/folderA/folderAB/file.jpg
À l'intérieur de mon PhotoController
je peux créer une instance de la WebClient
donner l'url et obtenir un MemoryStream
. Si je tente d'utiliser ce flux de mémoire pour remplir la réponse.contenu-je obtenir une réponse vide (par fiddler). Si j'utilise le flux de mémoire pour écrire dans un fichier local, puis lire le fichier (à l'aide d'un FileStream et FileInfo), il fonctionne "comme prévu".
Je devrais être en mesure d'obtenir à partir d'une MemoryStream
à StreamContent
sans passer par le système de fichiers (que je ne devrais pas) ?? mais Comment?
Le constructeur par défaut pour StreamContent(stream)
accepte la mémoire de l'instance de flux de données sans erreur du compilateur...mais il juste ne travail.
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;
Lors de l'essai par Fiddler-je obtenir:
[Fiddler] ReadResponse() a échoué: Le serveur n'a pas de retour complet
la réponse à cette demande. Le serveur a renvoyé 0 octets.
(lorsque vous allez à travers FileStream Fiddler me montre l'image.)
source d'informationauteur Cos Callis
Vous devez vous connecter pour publier un commentaire.
Dans votre code le flux de mémoire est à l'éliminer avant qu'il puisse passer du contenu de la réponse. La réponse renvoyée seront éliminés à l'aide d'un flux de mémoire, donc il n'y a notheing de retour, d'où le 0 octets dans un violon.