четверг, июля 17, 2008

This message cannot support the operation because it has been copied

Собственно, возникла такая нехорошая проблема при разработке собственного message inspector, при очередной попытке прочитать body у message пришлось натолкнуться...

Проблема и ее решение описаны на официальном сайте команды разработки wcf:


http://wcf.netfx3.com/blogs/wcf_team_bloggers/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
http://blogs.msdn.com/drnick/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx



можно привести кусок кода в моем случае:

protected override Message OnAfterReceivedRequest(string authToken, Message request)
{

// проблема описана в WCF
// http://wcf.netfx3.com/blogs/wcf_team_bloggers/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
// http://blogs.msdn.com/drnick/archive/2006/07/26/This-message-cannot-support-the-operation-because-it-has-been-copied.aspx
// This message cannot support the operation because it has been copied
// This message cannot support the operation because it has been readed

MessageBuffer buffer = request.CreateBufferedCopy(int.MaxValue);
Message returnMessage = buffer.CreateMessage();
string parameters = buffer.CreateMessage().GetReaderAtBodyContents().ReadInnerXml();
buffer.Close();


string action = request.Headers.Action;
AuthorizationManager.RegistryOperationInvocation(authToken, action, parameters);

return returnMessage;
}



т.е. суть решения сводится к тому, чтобы работать каждый раз с копией message, а не с самим сообщением...

Комментариев нет: