I need to retrieve binary (non-XML) documents as Messages in a custom WCF LOB Adapter (for consumption by BizTalk). The messages need to be represented as instances of System.ServiceModel.Channel.Message.
I can’t find how to create an instance of this class when the content is binary (by ‘binary’ I mean any arbitrary byte array or Stream, and not only binary representations of XML documents).
Is this possible? Or would wraping the binary contents in an XML enveloppe be the only way to do this in WCF?
Fundamentally, WCF messages are XML, since the S.S.C.Message class uses the Xml InfoSet as the base message representation.
So yes, in some way you need to ‘wrap’ your binary content into an XML envelope (which doesn’t need to be a SOAP envelope, mind you, depending on how your binding is configured).
That said, note that this doesn’t preclude streaming to deal with large message payloads without buffering the entire message in memory; WCF still allows you to do this, though sometimes it’s not greatly obvious how it works.
Since you’re working with a custom channel, you’ve got one of two choices, I think:
In either case, if you’re dealing with large messages, you’ll want to make sure you use the MessageEncoder overloads that handle Streams instead of buffers, as they are the ones that give you the option of doing coordinated streaming with the service implementation.