What is different with PushStreamContent between web api & web api 2?

huxley picture huxley · Nov 17, 2013 · Viewed 12.4k times · Source

I've created two identical web api projects, one in VS 2012 and another in VS 2013, both targeting the 4.5 .net framework. The projects are based on Filip W's video download tutorial found here: http://www.strathweb.com/2013/01/asynchronously-streaming-video-with-asp-net-web-api/

Copying & pasting the code from the tutorial into the VS 2012 project (using web api 1?) produces no errors (after I add the proper 'using' statements).

However, when I follow the same steps in the VS 2013 project I get the following two errors:

Error 1
The call is ambiguous between the following methods or properties: 'PushStreamContent(System.Func<Stream,HttpContent,TransportContext,Task>, MediaTypeHeaderValue)' and 'PushStreamContent(System.Action<System.IO.Stream,HttpContent,TransportContext>, MediaTypeHeaderValue)'

Error 2
'void video_stream.Controllers.VideoStream.WriteToStream(System.IO.Stream, System.Net.Http.HttpContent, System.Net.TransportContext)' has the wrong return type

So my guess is error 2 is the real problem as this code:

public async void WriteToStream(Stream outputStream, HttpContent content, TransportContext context) {...}

Is not identified as an <action> anymore between web api 1 & 2?? I'm really confused here as I'm targeting the same framework, and I can't seem to make the intuitive leap on how to fix it. My attempts at changing the WriteToStream signature have all failed.

Does anybody have a clue on what I need to get PushStreamContent to accept WriteToStream in web api 2 or VS 2013 or the new C# or where ever the difference in this code lives?

Answer

Bill Heitstuman picture Bill Heitstuman · Apr 30, 2014

The signature of the PushStreamContent constructor changed. Its onStreamAvailable parameter is an Action or Func generic type. The trouble is that the compiler doesn't know which type to bind to.

So to resolve the error cast the streamAvailableHandler as an Action:

response.Content = new PushStreamContent((Action<Stream, HttpContent, TransportContext>)streamAvailableHandler);

And the handler method would be:

private void streamAvailableHandler(Stream stream, HttpContent content, TransportContext context) {
  ...write to stream
}