Search code examples
asp.netvideoiis-7http-headersashx

Play a video file from a Virtual URL


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...)


Solution

  • 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...