Nous essayons de renvoyer des fichiers image volumineux en utilisant ASP.Net WebApi et en utilisant le code suivant pour transmettre les octets au 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 traitons pourraient avoir une taille supérieure ou égale à 2 Go, ce qui entraînerait des délais de connexion. Nous avons déjà utilisé un code similaire à ci-dessous (à l'aide de HttpHandlers) pour découper la réponse dans le flux de réponses afin de maintenir la connexion en vie 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 pouvons-nous utiliser une technique similaire à l'aide du nouveau modèle de programmation WebAPI présenté précédemment?
Merci d'avance
Oui, vous pouvez utiliser PushStreamContent
. Et si vous le combinez avec une exécution asynchrone (en utilisant, par exemple, des lambda asynchrones), vous obtiendrez des résultats encore plus efficaces.
J'ai blogué à propos de cette approche au début du mois - http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/ .
L'exemple utilisé est un fichier vidéo, le principe est le même: réduire le nombre d'octets de données au client.
Diffusez directement à partir du fichier en utilisant StreamContent
(trop nouveau?). Semblable à Le contrôleur API Web convertit MemoryStream en StreamContent
httpResponseMessage.Content = new StreamContent(file);