Silverlight video doesn't work when file is streamed from handler

Discussion in 'ASP .Net' started by Roger Martin, Nov 10, 2008.

  1. Roger Martin

    Roger Martin Guest

    Note: My apologies for repeating this post from last week, but my nospam
    alias and profile account were incorrect. I think I have fixed this, so
    hopefully this post will trigger MS into a response per their MSDN policy.
    --------------------

    I have a web site under .NET 2.0 that renders videos using the Silverlight
    media player.

    The web page looks like this:
    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="video2.aspx.cs"
    Inherits="WebApplication2.video2" %>

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server">
    <Scripts>
    <asp:ScriptReference Path="~/script/SilverlightControl.js" />
    <asp:ScriptReference Path="~/script/SilverlightMedia.js" />
    </Scripts>
    </asp:ScriptManager>
    <div id="mp1p" />

    <script type="text/javascript">
    //<![CDATA[
    Sys.UI.Silverlight.Control.createObject('mp1p', '\u003cobject
    type="application/x-silverlight" id="MediaPlayer1"
    style="height:240px;width:320px;">\r\n\t\u003ca
    href="http://go2.microsoft.com/fwlink/?LinkID=114576&v=1.0">\u003cimg
    src="http://go2.microsoft.com/fwlink/?LinkID=108181" alt="Get Microsoft
    Silverlight" style="border-width:0;" />\u003c/a>\r\n\u003c/object>');
    Sys.Application.initialize();
    Sys.Application.add_init(function()
    {
    // This works:
    $create(Sys.UI.Silverlight.MediaPlayer, { "mediaSource":
    "video/3StrikesChipmunk_56.wmv", "scaleMode": 1, "source":
    "skins/mediaplayer/Professional.xaml" }, null, null, $get("mp1p"));

    // This does not work (only difference is that it gets the video from the
    handler)
    //$create(Sys.UI.Silverlight.MediaPlayer, { "mediaSource":
    "handler/getmediaobject.ashx", "scaleMode": 1, "source":
    "skins/mediaplayer/Professional.xaml" }, null, null, $get("mp1p"));
    });
    //]]>
    </script>
    </form>
    </body>
    </html>

    ----------------------------------------
    This page works great when I directly reference the video file. But when I
    try to use an HTTP handler instead, all I get is an empty Silverlight control
    with the Play button disabled and no video. You can repro it by commenting
    out the $create line above that references the WMV file and uncomment the
    line below it that uses the getmediaobject.ashx handler.

    The getmediaobject.ashx handler is straight forward:

    using System.IO;
    using System.Web;
    using System.Web.SessionState;

    namespace WebApplication2.handler
    {
    [System.Web.Services.WebService(Namespace = "http://tempuri.org/")]
    [System.Web.Services.WebServiceBinding(ConformsTo =
    System.Web.Services.WsiProfiles.BasicProfile1_1)]
    public class getmediaobject : IHttpHandler
    {
    #region IHttpHandler Members

    public bool IsReusable
    {
    get { return true; }
    }

    public void ProcessRequest(HttpContext context)
    {
    ProcessMediaObject(context,
    context.Server.MapPath("~/video/3StrikesChipmunk_56.wmv"));
    }

    #endregion

    private void ProcessMediaObject(HttpContext context, string filePath)
    {
    FileStream fileStream = null;
    try
    {
    context.Response.Clear();
    context.Response.ContentType = "video/x-ms-wmv";
    context.Response.Buffer = false;

    HttpCachePolicy cachePolicy = context.Response.Cache;
    cachePolicy.SetExpires(System.DateTime.Now.AddSeconds(2592000)); // 30
    days
    cachePolicy.SetCacheability(HttpCacheability.Public);
    cachePolicy.SetValidUntilExpires(true);

    const int bufferSize = 32768;
    byte[] buffer = new byte[bufferSize];
    long byteCount;
    fileStream = File.OpenRead(filePath);
    while ((byteCount = fileStream.Read(buffer, 0, buffer.Length)) > 0)
    {
    if (context.Response.IsClientConnected)
    {
    context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    context.Response.Flush();
    }
    else
    {
    return;
    }
    }
    }
    finally
    {
    if (fileStream != null)
    fileStream.Close();

    context.Response.End();
    }
    }
    }
    }

    The really odd part is that the handler *does* work on my local network - it
    only
    fails when I publish the code to a web server and then access the page
    across the internet. It happens on both IIS 6 and IIS 7, and in IE and
    Firefox.

    I published the above code at
    http://www.galleryserverpro.com/dev/webapp2/video2.aspx. The page is
    currently configured to use the handler so that you can see it failing for
    yourself.

    Additional info:
    1. I am using the final release of 2.0 Silverlight, including the two script
    files SilverlightControl.js and SilverlightMedia.js.
    2. I have confirmed that no exception is occuring in the handler.
    3. Using Firebug I can confirm that the handler is being called and that it
    is returning data to the browser.

    All evidence points to Silverlight not being able to handle the data
    streamed from Silverlight. Perhaps there is a change I can make to the
    handler to get it to work, or maybe there is an issue within Silverlight.
    Please advise.

    Thanks!
    Roger Martin
     
    Roger Martin, Nov 10, 2008
    #1
    1. Advertising

  2. Hi Roger,

    I tested your page and it works fine on my side:
    http://www.galleryserverpro.com/dev/webapp2/video2.aspx

    Have you solved this issue? After the site has been published can you watch
    the video when using Windows Media Player to access the ashx? If it cannot
    work for Windows Media Player either I think probably it's not an
    Silverlight issue. We can then move on to diagnose the IIS and the
    HttpHandler.

    Regards,
    Allen Chen
    Microsoft Online Support

    Delighting our customers is our #1 priority. We welcome your comments and
    suggestions about how we can improve the support we provide to you. Please
    feel free to let my manager know what you think of the level of service
    provided. You can send feedback directly to my manager at:
    .

    ==================================================
    Get notification to my posts through email? Please refer to
    http://msdn.microsoft.com/en-us/subscriptions/aa948868.aspx#notifications.

    Note: MSDN Managed Newsgroup support offering is for non-urgent issues
    where an initial response from the community or a Microsoft Support
    Engineer within 2 business day is acceptable. Please note that each follow
    up response may take approximately 2 business days as the support
    professional working with you may need further investigation to reach the
    most efficient resolution. The offering is not appropriate for situations
    that require urgent, real-time or phone-based interactions. Issues of this
    nature are best handled working with a dedicated Microsoft Support Engineer
    by contacting Microsoft Customer Support Services (CSS) at
    http://msdn.microsoft.com/en-us/subscriptions/aa948874.aspx
    ==================================================
    This posting is provided "AS IS" with no warranties, and confers no rights.

    --------------------
    | Thread-Topic: Silverlight video doesn't work when file is streamed from
    handler
    | thread-index: AclDPnB+5p6h0JhHTZ6iqWci7rNrCg==
    | From: =?Utf-8?B?Um9nZXIgTWFydGlu?= <>
    | Subject: Silverlight video doesn't work when file is streamed from handler
    | Date: Mon, 10 Nov 2008 06:13:01 -0800
    | Lines: 160
    | Message-ID: <>
    | MIME-Version: 1.0
    | Content-Type: text/plain;
    | charset="Utf-8"
    | Content-Transfer-Encoding: 7bit
    | X-Newsreader: Microsoft CDO for Windows 2000
    | Content-Class: urn:content-classes:message
    | Importance: normal
    | Priority: normal
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.3168
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | Path: TK2MSFTNGHUB02.phx.gbl
    | Xref: TK2MSFTNGHUB02.phx.gbl
    microsoft.public.dotnet.framework.aspnet:79560
    | NNTP-Posting-Host: tk2msftibfm01.phx.gbl 10.40.244.149
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    |
    | Note: My apologies for repeating this post from last week, but my nospam
    | alias and profile account were incorrect. I think I have fixed this, so
    | hopefully this post will trigger MS into a response per their MSDN policy.
    | --------------------
    |
    | I have a web site under .NET 2.0 that renders videos using the
    Silverlight
    | media player.
    |
    | The web page looks like this:
    | <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="video2.aspx.cs"
    | Inherits="WebApplication2.video2" %>
    |
    | <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    | "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    | <html xmlns="http://www.w3.org/1999/xhtml">
    | <head runat="server">
    | <title></title>
    | </head>
    | <body>
    | <form id="form1" runat="server">
    | <asp:ScriptManager ID="ScriptManager1" runat="server">
    | <Scripts>
    | <asp:ScriptReference Path="~/script/SilverlightControl.js" />
    | <asp:ScriptReference Path="~/script/SilverlightMedia.js" />
    | </Scripts>
    | </asp:ScriptManager>
    | <div id="mp1p" />
    |
    | <script type="text/javascript">
    | //<![CDATA[
    | Sys.UI.Silverlight.Control.createObject('mp1p', '\u003cobject
    | type="application/x-silverlight" id="MediaPlayer1"
    | style="height:240px;width:320px;">\r\n\t\u003ca
    | href="http://go2.microsoft.com/fwlink/?LinkID=114576&v=1.0">\u003cimg
    | src="http://go2.microsoft.com/fwlink/?LinkID=108181" alt="Get Microsoft
    | Silverlight" style="border-width:0;" />\u003c/a>\r\n\u003c/object>');
    | Sys.Application.initialize();
    | Sys.Application.add_init(function()
    | {
    | // This works:
    | $create(Sys.UI.Silverlight.MediaPlayer, { "mediaSource":
    | "video/3StrikesChipmunk_56.wmv", "scaleMode": 1, "source":
    | "skins/mediaplayer/Professional.xaml" }, null, null, $get("mp1p"));
    |
    | // This does not work (only difference is that it gets the video from
    the
    | handler)
    | //$create(Sys.UI.Silverlight.MediaPlayer, { "mediaSource":
    | "handler/getmediaobject.ashx", "scaleMode": 1, "source":
    | "skins/mediaplayer/Professional.xaml" }, null, null, $get("mp1p"));
    | });
    | //]]>
    | </script>
    | </form>
    | </body>
    | </html>
    |
    | ----------------------------------------
    | This page works great when I directly reference the video file. But when
    I
    | try to use an HTTP handler instead, all I get is an empty Silverlight
    control
    | with the Play button disabled and no video. You can repro it by
    commenting
    | out the $create line above that references the WMV file and uncomment the
    | line below it that uses the getmediaobject.ashx handler.
    |
    | The getmediaobject.ashx handler is straight forward:
    |
    | using System.IO;
    | using System.Web;
    | using System.Web.SessionState;
    |
    | namespace WebApplication2.handler
    | {
    | [System.Web.Services.WebService(Namespace = "http://tempuri.org/")]
    | [System.Web.Services.WebServiceBinding(ConformsTo =
    | System.Web.Services.WsiProfiles.BasicProfile1_1)]
    | public class getmediaobject : IHttpHandler
    | {
    | #region IHttpHandler Members
    |
    | public bool IsReusable
    | {
    | get { return true; }
    | }
    |
    | public void ProcessRequest(HttpContext context)
    | {
    | ProcessMediaObject(context,
    | context.Server.MapPath("~/video/3StrikesChipmunk_56.wmv"));
    | }
    |
    | #endregion
    |
    | private void ProcessMediaObject(HttpContext context, string filePath)
    | {
    | FileStream fileStream = null;
    | try
    | {
    | context.Response.Clear();
    | context.Response.ContentType = "video/x-ms-wmv";
    | context.Response.Buffer = false;
    |
    | HttpCachePolicy cachePolicy = context.Response.Cache;
    | cachePolicy.SetExpires(System.DateTime.Now.AddSeconds(2592000)); //
    30
    | days
    | cachePolicy.SetCacheability(HttpCacheability.Public);
    | cachePolicy.SetValidUntilExpires(true);
    |
    | const int bufferSize = 32768;
    | byte[] buffer = new byte[bufferSize];
    | long byteCount;
    | fileStream = File.OpenRead(filePath);
    | while ((byteCount = fileStream.Read(buffer, 0, buffer.Length)) > 0)
    | {
    | if (context.Response.IsClientConnected)
    | {
    | context.Response.OutputStream.Write(buffer, 0, buffer.Length);
    | context.Response.Flush();
    | }
    | else
    | {
    | return;
    | }
    | }
    | }
    | finally
    | {
    | if (fileStream != null)
    | fileStream.Close();
    |
    | context.Response.End();
    | }
    | }
    | }
    | }
    |
    | The really odd part is that the handler *does* work on my local network -
    it
    | only
    | fails when I publish the code to a web server and then access the page
    | across the internet. It happens on both IIS 6 and IIS 7, and in IE and
    | Firefox.
    |
    | I published the above code at
    | http://www.galleryserverpro.com/dev/webapp2/video2.aspx. The page is
    | currently configured to use the handler so that you can see it failing
    for
    | yourself.
    |
    | Additional info:
    | 1. I am using the final release of 2.0 Silverlight, including the two
    script
    | files SilverlightControl.js and SilverlightMedia.js.
    | 2. I have confirmed that no exception is occuring in the handler.
    | 3. Using Firebug I can confirm that the handler is being called and that
    it
    | is returning data to the browser.
    |
    | All evidence points to Silverlight not being able to handle the data
    | streamed from Silverlight. Perhaps there is a change I can make to the
    | handler to get it to work, or maybe there is an issue within Silverlight.
    | Please advise.
    |
    | Thanks!
    | Roger Martin
    |
    |
     
    Allen Chen [MSFT], Nov 11, 2008
    #2
    1. Advertising

  3. Roger Martin

    Roger Martin Guest

    RE: Silverlight video doesn't work when file is streamed from hand

    I got it! After comparing the Response headers of the handler versus the
    hard-coded link, I noticed the handler version did not have a Content-Length.
    So I added this line to the handler:

    context.Response.AddHeader("Content-Length", fileStream.Length.ToString());

    Voila! The video started working in every OS/browser after that.

    There is a new problem where I can't jump around to different sections of
    the video when using the handler, but I'll create a new post for that.

    Thanks! Roger
     
    Roger Martin, Nov 13, 2008
    #3
  4. RE: Silverlight video doesn't work when file is streamed from hand

    Hi Roger,

    Good job! I have to say you're an experienced developer. Before you sending
    this post I thought we need do more complex steps to diagnose this issue.
    Anyway I'm glad to know you've solved this problem.

    Thank you for using our Newsgroup Support Service!

    Regards,
    Allen Chen
    Microsoft Online Community Support


    =================================================
    Delighting our customers is our #1 priority. We welcome your comments and
    suggestions about how we can improve the support we provide to you. Please
    feel free to let my manager know what you think of the level of service
    provided. You can send feedback directly to my manager at:
    .
    =================================================

    --------------------
    | Thread-Topic: Silverlight video doesn't work when file is streamed from
    hand
    | thread-index: AclFO+spmJsgQMmcTnKfyTgMonN+Ow==
    | X-WBNR-Posting-Host: 207.46.192.207
    | From: =?Utf-8?B?Um9nZXIgTWFydGlu?= <>
    | References: <>
    <>
    <>
    <>
    | Subject: RE: Silverlight video doesn't work when file is streamed from
    hand
    | Date: Wed, 12 Nov 2008 19:00:00 -0800
    | Lines: 12
    | Message-ID: <>
    | MIME-Version: 1.0
    | Content-Type: text/plain;
    | charset="Utf-8"
    | Content-Transfer-Encoding: 7bit
    | X-Newsreader: Microsoft CDO for Windows 2000
    | Content-Class: urn:content-classes:message
    | Importance: normal
    | Priority: normal
    | X-MimeOLE: Produced By Microsoft MimeOLE V6.00.3790.3168
    | Newsgroups: microsoft.public.dotnet.framework.aspnet
    | Path: TK2MSFTNGHUB02.phx.gbl
    | Xref: TK2MSFTNGHUB02.phx.gbl
    microsoft.public.dotnet.framework.aspnet:79773
    | NNTP-Posting-Host: tk2msftibfm01.phx.gbl 10.40.244.149
    | X-Tomcat-NG: microsoft.public.dotnet.framework.aspnet
    |
    | I got it! After comparing the Response headers of the handler versus the
    | hard-coded link, I noticed the handler version did not have a
    Content-Length.
    | So I added this line to the handler:
    |
    | context.Response.AddHeader("Content-Length",
    fileStream.Length.ToString());
    |
    | Voila! The video started working in every OS/browser after that.
    |
    | There is a new problem where I can't jump around to different sections of
    | the video when using the handler, but I'll create a new post for that.
    |
    | Thanks! Roger
    |
     
    Allen Chen [MSFT], Nov 13, 2008
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Robbie
    Replies:
    5
    Views:
    777
    Robbie
    May 10, 2005
  2. Jassim Rahma

    silverlight video website with ASP.NET

    Jassim Rahma, Sep 3, 2007, in forum: ASP .Net
    Replies:
    5
    Views:
    493
    Michael Nemtsev, MVP
    Sep 6, 2007
  3. Roger Martin
    Replies:
    0
    Views:
    3,305
    Roger Martin
    Aug 19, 2008
  4. Roger Martin
    Replies:
    1
    Views:
    882
    Izisin
    Apr 15, 2009
  5. Roger Martin
    Replies:
    17
    Views:
    801
    Allen Chen [MSFT]
    Dec 18, 2008
Loading...

Share This Page