Streaming de grandes images à l'aide de ASP.Net Webapi
Nous essayons de retour de gros fichiers d'image à l'aide de ASP.Net WebApi et en utilisant le code suivant dans le flux d'octets pour le client.
public class RetrieveAssetController : ApiController
{
//GET api/retrieveasset/5
public HttpResponseMessage GetAsset(int id)
{
HttpResponseMessage httpResponseMessage = new HttpResponseMessage();
string filePath = "SomeImageFile.jpg";
MemoryStream memoryStream = new MemoryStream();
FileStream file = new FileStream(filePath, FileMode.Open, FileAccess.Read);
byte[] bytes = new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
memoryStream.Write(bytes, 0, (int)file.Length);
file.Close();
httpResponseMessage.Content = new ByteArrayContent(memoryStream.ToArray());
httpResponseMessage.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
httpResponseMessage.StatusCode = HttpStatusCode.OK;
return httpResponseMessage;
}
}
Le code ci-dessus fonctionne bien, mais certains des fichiers que nous avons affaire à 2 GO et vers le haut en taille, résultant dans les délais de connexion. Nous avons utilisé un code similaire à ci-dessous dans le passé (à l'aide de HttpHandlers) pour découper la réponse à la réponse de flux de garder la connexion avec succès.
byte[] b = new byte[this.BufferChunkSize];
int byteCountRead = 0;
while ((byteCountRead = stream.Read(b, 0, b.Length)) > 0)
{
if (!response.IsClientConnected) break;
response.OutputStream.Write(b, 0, byteCountRead);
response.Flush();
}
Comment peut-on utiliser une technique similaire à l'aide de la nouvelle WebAPI modèle de programmation montré plus tôt?
Je vous remercie à l'avance
OriginalL'auteur raj | 2013-02-04
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez utiliser
PushStreamContent
. Et si vous le combinez avec mode d'exécution asynchrone (usin c'est à dire async lambdas), vous risquez d'obtenir des résultats plus efficaces.J'ai blogué sur cette approche, plus tôt ce mois - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/.
L'exemple utilisé un fichier vidéo, le principe est le même en poussant vers le bas octets de données pour le client.
Oui tout à l'API Web 4.0 est compatible. Vous pouvez simplement supprimer async/await et de faire toute chose synchrone, ou tout simplement utiliser les continuations (ContinueWith) où le code est attendue.
W - Ce qui fonctionne bien pour moi. Je vous remercie beaucoup pour votre aide à nouveau. J'ai accepté votre réponse. Merci encore
bel article!!!!
OriginalL'auteur Filip W
Stream directement depuis le fichier à l'aide de
StreamContent
(trop?). Semblable à Web API Contrôleur de convertir MemoryStream dans StreamContentbizarre, je pense que quelque chose est "interrompre" le téléchargement, le client d'abandonner parce que quelque chose est de prendre "trop long" sur le serveur, ou pourriez-vous être accidentellement une déformation d'origine filestream? Je l'ai fait avant, mettre un flux de données en quelque chose, et ensuite, soit disposant d'un lecteur/écrivain trop tôt (ce qui ferme le flux c'est en agissant en fonction d'un paramètre). Peut-être que vous êtes à la limitation de la lecture du fichier ou le fichier source est déplacé/supprimé dans le milieu de streaming?
OriginalL'auteur drzaus