【问题标题】:WCF - Message and MessageBuffer closeWCF - 消息和消息缓冲区关闭
【发布时间】:2014-03-31 08:07:47
【问题描述】:

Msdn says: 该消息还会释放用于构造主体的对象。

据此,我推断关闭 Message 也会关闭创建它的 MessageBuffer。但在实际代码中并非如此。关闭消息将 messagebuffer.close 保留为 false。

应该如何关闭消息缓冲区和从该缓冲区创建的消息?

【问题讨论】:

    标签: wcf memory-management dispose wcf-extensions


    【解决方案1】:

    下面的源代码将帮助您了解如何使用从消息缓冲区创建的消息。

    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; }
        }
    }
    

    【讨论】:

    • 在我的情况下 using 不是一个选项。因为 dispose/close 应该发生在一些回调中(特别是在 OperationContext.Current.OperationCompleted 中)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多