I know the question is C# code, but I am including Powershell script here for those of us that like to quickly inspect MSMQ contents using the shell. Using Edward's code I also made this work with Powershell, if anybody is looking for a script that can extract these WCF messages that is sent as payload to the WCF service with endpoints using the protocol binding NetMsmqbinding or NetMsmqIntegrationBinding. 
Instead of using Int32.MaxValue, I used another large integer value that I know would suffice in most cases. It would be nice to know the logic behind finding the Soap Envelope start by the way. 
Here is the Powershell script: 
[System.Reflection.Assembly]::LoadWithPartialName("System.Messaging") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.Xml") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.ServiceModel") | Out-Null
[System.Reflection.Assembly]::LoadWithPartialName("System.IO") | Out-Null
$queuePath = ".\private$\demoqueue4"
Write-Host "Powershell MSMQ queue WCF inspector v0.1. Inspecting queue contents of the queue: $queuePath"
Write-Host ""
Run-MainDemoIterateMsmq $queuePath
Function Get-XmlFromWcfMessage([System.Messaging.Message] $msg) {
    $doc = New-Object System.Xml.XmlDocument;
    $messageLength = [int] $msg.BodyStream.Length
    $buffer = New-Object byte[] $messageLength
    $msg.BodyStream.Read($buffer, 0, $messageLength)
    $envelopeStart = Find-SoapEnvelopeStart($buffer)
    $envelopeStart = $envelopeStart - 0
    $envelopeLength = $($buffer.Length - $envelopeStart)
    #Write-Host $envelopeStart
    $stream = New-Object System.IO.MemoryStream($buffer, $envelopeStart, $envelopeLength)
    $elm = New-Object System.ServiceModel.Channels.BinaryMessageEncodingBindingElement
    $elm.ReaderQuotas.MaxStringContentLength = 10000000
    $elm.ReaderQuotas.MaxBytesPerRead = 10000000
    $msg1 = $elm.CreateMessageEncoderFactory().Encoder.ReadMessage($stream, 10000000);
    $doc.Load($msg1.GetReaderAtBodyContents());
    $msg.BodyStream.Position = 0;
    return $doc;
}
Function Find-SoapEnvelopeStart([byte[]] $stream)
{
    $i = 0;
    $j = 0;
    $prevByte = $stream[$i];
    $curByte = [byte]$j;
    for ($i = 0; $i -lt $stream.Length; $i++)
    {
        $curByte = $stream[$i];
        if ($curByte -eq [byte] 0x02 -and $prevByte -eq [byte] 0x56) {
            break;
        }
        $prevByte = $curByte;
    }
    return $i - 1;
}
Function Run-MainDemoIterateMsmq([string] $queuePath) {
$queue = New-Object System.Messaging.MessageQueue $queuePath
foreach ($message in $queue.GetAllMessages()){
  $xmlDoc = Get-XmlFromWcfMessage $message 
  Write-Host $xmlDoc.OuterXml
 } 
}
The output can then look like this for example:
    <SendMessage xmlns="http://tempuri.org/"><message>this is another test!</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>why hello srmp</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>test</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>my message to msmq</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>This is a new message!</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>Another message to MSMQ! </message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>another test here</message></SendMessage>
    <SendMessage xmlns="http://tempuri.org/"><message>This is a test message that will be sent using NetMsmqBinding. </message></SendMessage>
    <SendMessageDataContract xmlns="http://tempuri.org/"><message xmlns:b="http://schemas.datacontract.org/2004/07/WcfDemoNetMsmqBinding.Host" xmlns:i="http://www.w3.org/2001
    /XMLSchema-instance"><b:BoolValue>true</b:BoolValue><b:StringValue>This is a test of a stringvalue for a CompositeType</b:StringValue></message></SendMessageDataContract>