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.