Trying to Avoid Buffering the Entire BLOB in a WCF Data Service Client? Well You Can’t
I wrote a series of blog posts on the WCF Data Services team blog that walks you through the (fairly complicated) process of accessing BLOB data (such as media files, documents, anything too big to return in the feed) from an OData service as a stream. My second post in this series showed how to use the WCF Data Services client to access and change BLOB data as a stream, in this case the Photo Streaming Data Service Sample.
In the process of creating this sample, I was dismayed to discover that the client was buffering the entire BLOB stream before sending it to the data service in a POST request. As you know from reading those posts, one of the big benefits of using streaming is to avoid having to buffer an entire BLOB in memory. The solution to this seemed obvious--I would just set AllowWriteStreamBuffering = false in the HttpWebRequest from the client, which I can get ahold of by handling the SendingRequest event). Ah, but the WCF Data Services client outsmarted me yet again. Apparently, the client sets properties on HttpWebRequest after the SendingRequest event fires, and it sets AllowWriteStreamBuffering = true on every request (grrrrrr).
I filed this little nasty as a bug with the product team, and it looks like it is being fixed for the next release (huzzah!).
Additional reading on streaming and OData:
- Streaming Provider (WCF Data Services)
- Working with Binary Data (WCF Data Services)
- Photo Streaming Data Service Sample
Cheers,
Glenn Gailey
OData: There’s a feed for that…
Comments
Anonymous
November 23, 2011
Hi, When trying to use the Data Service, I am running into a similar issue, I have tried using the October CTP to no avail. Would you be able to tell if the issue is resolved. ThanksAnonymous
November 23, 2011
In the Oct 2011 CTP, the client should be honoring (and not overriding) the AllowWriteStreamBuffering setting. Have you tried handling the SendingRequest event to set this property of HttpWebRequest to false?