6

Ho un'applicazione di webforms asp.net e recuperare i video dal database salvato nel formato varbinary e mostrarlo come tag video html5.Stream.WriteAsync gira L'host remoto ha chiuso l'eccezione di connessione

dopo un Googled esso, ho trovato un modo che avrei dovuto giocare in modo asincrono utilizzando ASP.Net WebApi, funziona benissimo

Primo problema

Quando il video riprodotto prima volta e l'utente clicca sul tasto play per ripeti il ​​video, The remote host closed the connection. The error code is 0x800704CD getta eccezioni alla riga await outputStream.WriteAsync(buffer, 0, bytesRead);.

secondo problema

Quando l'utente clicca sulla barra di ricerca, il video va a giocato da prima.

NOTA

Internet Explorer 11 riproduce il video senza alcun problema, ma Firefox e Chrome hanno entrambi i problemi.

come posso risolvere questo problema?

Ecco i miei codici:

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     config.EnableCors(); 

     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "VideoApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

public class VideoController : ApiController 
{ 
    public IVideoRepository videoRepository; 

    public HttpResponseMessage Get(long id) 
    { 
     try 
     { 
      videoRepository = new VideoRepository(); 
      Video video = videoRepository.load(id); 

      if (video != null) 
      { 
       var videoStream = new VideoStream(video.fileContent); 
       string ext = video.extension; 

       var response = Request.CreateResponse(); 

       response.Content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>)videoStream.WriteToStream, new MediaTypeHeaderValue("video/" + ext)); 

       response.Content.Headers.Add("Content-Disposition", "attachment;filename=" + video.fullName.Replace(" ", "")); 
       response.Content.Headers.Add("Content-Length", videoStream.FileLength.ToString()); 

       return response; 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.NotFound); 
      } 
     } 
     catch (Exception e) 
     { 
      return Request.CreateErrorResponse(HttpStatusCode.ServiceUnavailable, e); 
     } 
    } 
} 

public class VideoStream 
{ 
    private readonly byte[] _fileContent; 
    private long _contentLength; 

    public long FileLength 
    { 
     get { return _contentLength; } 
    } 

    public VideoStream(byte[] content) 
    { 
     _contentLength = content.Length; 
     _fileContent = content; 
    } 

    public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context) 
    { 
     try 
     { 
      var buffer = new byte[65536]; 

      MemoryStream memoryStream = new MemoryStream(); 
      memoryStream.Write(_fileContent, 0, _fileContent.Length); 
      memoryStream.Position = 0; 
      using (memoryStream) 
      { 
       var length = (int)memoryStream.Length; 
       var bytesRead = 1; 

       while (length > 0 && bytesRead > 0) 
       { 
        bytesRead = memoryStream.Read(buffer, 0, Math.Min(length, buffer.Length)); 
        await outputStream.WriteAsync(buffer, 0, bytesRead); 
        length -= bytesRead; 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
     finally 
     { 
      outputStream.Close(); 
     } 
    } 
} 

UPDATE

dopo in questo modo non ha funzionato correttamente, ho dovuto usare this way, ma il nuovo modo avere problemi SeekBar, quando l'utente clicca su cerca la barra per cercare di cronometrare che non funzioni in Chrome e FireFox.

risposta

0

ASP.NET non è molto buono per lo streaming video. La soluzione di streaming video di terze parti è l'opzione migliore.

Ci sono alcuni server di streaming video (come Wowza), ma richiedono l'installazione e si deve acquistare la licenza.

Il servizio di streaming del cloud è un'altra opzione. Personalmente preferisco lo AWS Cloudfront. Propongono la distribuzione in varie zone di distribuzione di contenuti distribuiti a livello globale. Costa davvero poco e si può essere sicuri che sopravviverà a qualsiasi quantità di traffico (anche se tutti gli utenti guarderanno lo stesso video contemporaneamente).

Problemi correlati