I'm having a hard time trying to play a video from a Virtual URL on a Website. I cannot link directly to the video as the actual files not located anywhere under the web-accessible root. And, the virtual path is actually an HTTP Handler (ASP.Net "ASHX") used for additional permission checks and such.
I was trying to set up video access (using JWPlayer, but didn't get to that point),
The ASHX handler I had in the beginning was simply transmitting the file as a download,
using HTTP Header: content-disposition: attachment; filename=example.mp4
When I compared the behavior of the browser (Chrome 20.0.1132.57) between browsing a direct link .mp4 file vs. the virtual link - I noticed that the direct link makes opens up in a small embedded video player, where as the virtual link only downloads the file.
I have tried (and failed) capturing the difference of HTTP Headers (using Fiddler) and writing a special ASHX for videos - that would send exactly the same response as the IIS does (without any specific config for mp4, not even a mime-type). I can't seem to get chrome to open the video from the virtual url like it does from the direct link, even if I emulate all headers (at least, to the best of my understanding).
I tried sending the right Content-Type & Content-Length
, using the Accept-Ranges & Content-Range
headers, even tried to emulate a two-phase request when the first one doesn't have video/mp4
or */*
in the Accept
header (I've also tried sending only 1 byte on the first response / sending the whole video on both responses).
(When I say all these values were "right" I mean that they were identical to the working response that I captured in Fiddler...)
Please, can somebody explain what triggers the browser to treat the file as a video?
What headers do I need to specify/omit ?
(besides omitting content-disposition: attachment
of course...)
Turns out the main problem was to do with the embedding code of JWPlayer.
When the URL pointing to the video doesn't include a recognized video extension - the player doesn't know what to do - So it requires an explicit definition.
Here is a functioning embed code for JWPlayer:
(notice the explicit specification of 'provider':'video'
)
<video id="jwplayer_placeholder"
src="http://localhost/mysite/SecuredFile.ashx?File=1234"
height="270"
width="480">
</video>
<script type="text/javascript">
jwplayer("jwplayer_placeholder").setup(
{
modes:
[
{ type: "flash", src: http://localhost/mysite/jwplayer/player.swf" },
{ type: 'html5' },
{ type: 'download' }
],
'provider':'video'
});
</script>
Hope this helps someone...