Je suis confondu avec les flux, renvoie la valeur et dispose. C'est à dire. J'utilise Stream et je veux retourner le flux de la méthode. Code suivant:Éliminer et renvoyer la valeur
public async Task<HttpResponseMessage> GetOverlayAsync(string fileUrl, string language, string strOCR)
{
HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
using (var stream = new FileStream(@"D:\\_forTest.jpg", FileMode.Open))
{
length = stream.Length;
result.Content = new StreamContent(stream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = Path.GetFileName("_forTest.jpg");
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = length;
return result;
}
}
et
public async Task<HttpResponseMessage> GetOverlayAsync(string fileUrl, string language, string strOCR)
{
long length = 0;
HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
using (var stream = new FileStream(@"D:\\_forTest.jpg", FileMode.Open))
{
length = stream.Length;
result.Content = new StreamContent(stream);
}
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = Path.GetFileName("_forTest.jpg");
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = length;
return result;
}
renvoie 504 code d'état:
ReadResponse() a échoué: Le serveur n'a pas retourné une réponse complète pour cette demande. Le serveur a renvoyé 0 octet.
, comme je comprends, le flux est disposé quand on sort de la méthode
Si je n'appelle jetez pas du tout:
public async Task<HttpResponseMessage> GetOverlayAsync(string fileUrl, string language, string strOCR)
{
long length = 0;
HttpResponseMessage result = Request.CreateResponse(HttpStatusCode.OK);
var stream = new FileStream(@"D:\\_forTest.jpg", FileMode.Open);
length = stream.Length;
result.Content = new StreamContent(stream);
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment");
result.Content.Headers.ContentDisposition.FileName = Path.GetFileName("_forTest.jpg");
result.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
result.Content.Headers.ContentLength = length;
return result;
}
parfois je reçois ce fichier est bloqué par un autre processus. Comment le faire correctement?
Vos exemples compilent-ils réellement? Les méthodes sont marquées comme 'async' mais il n'y a pas de' await' dans les méthodes. – Sean
J'ai supprimé le code inutile avant –
Essayez d'ouvrir le flux de fichier comme ceci: 'nouveau FileStream (@" D: \\ _ forTest.jpg ", FileMode.Open, FileAccess.Read, FileShare.Read);' et bien sûr ne pas Disposez-le (sera automatiquement éliminé pour vous après l'envoi au client). Quand vous faites juste 'new FileStream (..., FileMode.Open)' - c'est l'équivalent de 'nouveau FileStream (..., FileMode.Open, FileAccess.ReadWrite, FileShare.Lire) 'et cela empêchera l'ouverture ultérieure du même fichier, même à partir du même processus. – Evk