Playing Video files in ASP.NET MVCOne such requirement in a web application could be that it allows binary contents e.g. images, videos, pdf etc. to be downloaded. ASP.NET MVC facilitates this requirement via the ActionResult abstract class. The derived classes from the ActionResult such as the FileContentResult and FileSTreamResult classes are useful to perform binary file download operations. However now consider the scenario that you as a developer want to restrict the Action method to download only the video file and sometimes instead of downloading it physically on the disk, just play it directly. Now that’s a special requirement, so how do we implement it in MVC? Enter the Custom Action Result which gets the job done!
Step 1: Open VS 2012 and create an ASP.NET MVC Empty application. Name it as ‘MVC40_CustomActionResult’. In this project, add a new folder and name it as ‘VideoFile’. In this folder, add Video files as per your choice. (I have used the .mp4 format)
Step 2: In the project, add a new folder name it as ‘CustomResult’. In this folder add a new class file and name it as ‘VideoResult.cs’. Add the following code in it:
public class VideoResult : ActionResult
/// The below method will respond with the Video file
/// <param name="context"></param>
public override void ExecuteResult(ControllerContext context)
//The File Path
var videoFilePath = HostingEnvironment.MapPath("~/VideoFile/Win8.mp4");
//The header information
context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=Win8.mp4");
var file = new FileInfo(videoFilePath);
//Check the file exist, it will be written into the response
var stream = file.OpenRead();
var bytesinfile = new byte[stream.Length];
stream.Read(bytesinfile, 0, (int)file.Length);
The ExecuteResult method implementation above looks for the Video file. If it is found, then set the response by writing the file into the response.
Step 3: In the application, add a new MVC Empty Controller, name it as VideoController and implement the code as below:
public class VideoController : Controller
// GET: /Video/
public ActionResult Index()
return new VideoResult();
The Index method now returns the VideoResult; the custom action result implemented in the previous step.
Step 4: Run the application and navigate to the, Video/Index URL and the download experience will be similar to the following:
Step 5: In the project, add a new MVC Empty controller with the name SampleController, and add an index method in it as shown below:
public class SampleController : Controller
// GET: /Sample/
public ActionResult Index()
Step 6: Add a new View from the above action method, and add the following HTML 5 Video tag in it:
<video width="320" height="240" controls autoplay="autoplay">
<source src="@Url.Action("Index","Video")" type="video/mp4">
The video tag shown above is provided in HTML 5. The src property is set to the Index method in the Video controller which we have implemented in Step 3.
Step 6: Run the application in a Browser (I have used Chrome), and the result will be as below:
That’s it. So now you can have your ASP.NET MVC application ready for playing various videos in the browser.
This is a handy page that shows which browser supports HTML5 Video and in which video format.
Conclusion: In ASP.NET MVC, using its extensibility feature, a developer can implement domain based requirements to provide the best end-user experiences. Custom ActionResult is one of the mechanism using which developer can think of defining some restrictions on the responses delivered to the Browser.