public HttpResponseMessage Get(string p) { try { //không check login vì ảnh hưởng đến performance //if (!Common.CheckLogin()) return null; var response = Request.CreateResponse(); response.Headers.TransferEncodingChunked = true; response.Headers.Add("Accept-Ranges", "bytes"); response.Headers.Add("Keep-Alive", "timeout=10"); //path.combine error?? //var appPath = WebConfigurationManager.AppSettings["PhysicalPath"]; var fileInfo = new FileInfo((appPath + p).Replace("\\", "/")); //check path if (string.IsNullOrEmpty(p)) { response.StatusCode = HttpStatusCode.NotFound; return(response); } if (!File.Exists(appPath + p)) { response.StatusCode = HttpStatusCode.NotFound; return(response); } var rangeHeader = Request.Headers.Range; var totalLength = fileInfo.Length; long start = 0, end = totalLength - 1; ContentRangeHeaderValue contentRange = null; //không có range hoặc là range gồm toàn bộ file if (rangeHeader == null || !rangeHeader.Ranges.Any()) { Common.WriteDebug("StreammingController, line 49 ", "Request video range is null or all file! \r\n" + p); response.Headers.AcceptRanges.Add("bytes"); response.StatusCode = HttpStatusCode.OK; } else { if (rangeHeader.Unit != "bytes" || rangeHeader.Ranges.Count > 1 || !MediaUtilities.CheckRangeItem(rangeHeader.Ranges.First(), totalLength, out start, out end)) { Common.WriteDebug("StreammingController, line 58", "Request video range is invalid! \r\n" + p); response.StatusCode = HttpStatusCode.RequestedRangeNotSatisfiable; response.Content = new StreamContent(Stream.Null); response.Content.Headers.ContentRange = new ContentRangeHeaderValue(totalLength); response.Content.Headers.ContentType = new MediaTypeHeaderValue(MediaUtilities.GetMimeType(fileInfo.Extension)); //trả về null stream return(response); } //range hợp lệ Common.WriteDebug("StreammingController, line 68", "Request video range is valid, send content! \r\n" + p); contentRange = new ContentRangeHeaderValue(start, end, totalLength); } // status code là partial content. response.StatusCode = HttpStatusCode.PartialContent; response.Headers.TransferEncodingChunked = true; if (fileInfo.Extension.ToLower().Equals(".oga") || fileInfo.Extension.ToLower().Equals(".mp3") || fileInfo.Extension.ToLower().Equals(".flac")) { response.Content = AudioContent(fileInfo, start, end); response.Content.Headers.ContentLength = end - start + 1; response.Headers.TransferEncodingChunked = null; response.Content.Headers.ContentType = new MediaTypeHeaderValue(MediaUtilities.GetMimeType(fileInfo.Extension)); } else { var vid = new VideoStream(appPath + p, start, end); response.Content = VideoContent(vid, fileInfo.Extension); response.Content.Headers.ContentType = new MediaTypeHeaderValue("video/mp4"); } if (contentRange != null) { response.Content.Headers.ContentRange = contentRange; } //if (Request.Headers.UserAgent.ToString().Contains("Firefox")) return response; response.Content.Headers.ContentLength = end - start + 1; return(response); } catch (Exception ex) { Common.WriteLog(MethodBase.GetCurrentMethod().Name, ex + ex.StackTrace); return(null); } }