0

Msdn says: The message also disposes the object that was used to construct the body when it is disposed.

From this what I infer is closing Message also closes the MessageBuffer it is created from. But in actual code this is not the case. Closing message leaves messagebuffer.closed as false.

How message buffer and message created from that buffer should be closed?

rovsen
  • 4,932
  • 5
  • 38
  • 60

1 Answers1

0

source code below will help you understand how to use message created from message buffer.

using System;
using System.Collections.Generic;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;

namespace _22756512 {
    class Program {
        static void Main(string[] args) {
            Order order = new Order() { Id = 1, CustomerName = "Smith" };
            var message = Message.CreateMessage(MessageVersion.Default, "http://127.0.0.1/someaction", order);
            Console.WriteLine("message.state after creation: " + message.State.ToString());

            using (MessageBuffer buffer = message.CreateBufferedCopy(int.MaxValue)) {
                Console.WriteLine("message.state after create bufferedcopy: " + message.State.ToString());

                using (var anotherMessage = buffer.CreateMessage()) {
                    var anotherOrder = anotherMessage.GetBody<Order>();
                    Console.WriteLine("anotherOrder.Id = " + anotherOrder.Id);
                    Console.WriteLine("antherOrder.customername = " + anotherOrder.CustomerName);
                }

                using (var the3rdMessage = buffer.CreateMessage()) {
                    var the3rdOrder = the3rdMessage.GetBody<Order>();
                    Console.WriteLine("3rd order.id = " + the3rdOrder.Id);
                    Console.WriteLine("3rd order.customer name = " + the3rdOrder.CustomerName);
                }
            }

            message.Close();
            Console.WriteLine("message.state after close: " + message.State.ToString());
            Console.Read();
        }
    }

    public class Order {
        public Int32 Id { get; set; }
        public String CustomerName { get; set; }
    }
}
Yang You
  • 2,618
  • 1
  • 25
  • 32
  • In my case *using* is not an option. Because dispose/close should happen in some callback (specifically in OperationContext.Current.OperationCompleted). – rovsen Mar 31 '14 at 12:19