[asp.net-mvc]Web Api 缓存和"无法访问已关闭的流"

发布时间: 2016/10/9 5:33:02
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我想使用此缓存库为 asp.net web api (https://github.com/filipw/AspNetWebApi-OutputCache)

安装它后我得到了这个错误,范围缩小到一个班的我 XmlMediaTypeFormatter 类。

Cannot access a closed Stream

我相信这与 Task.Factory.StarNew()XmlTextWriter 关闭蒸汽在某个地方在 WriteToStreamAsync 方法。 有另一种方式来处理此代码吗?

 public class CustomXmlFormatter : XmlMediaTypeFormatter 
    {
        public CustomXmlFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/xml"));
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/xml"));
            Encoding = new UTF8Encoding(false, true);
        }

        protected UTF8Encoding Encoding { get; set; }

        public override bool CanReadType(Type type)
        {
            if (type == null)
                return false;

            return true;
        }
        public override bool CanWriteType(Type type)
        {
            if (type == null)
                return false;

            return true;
        }

        public override Task<object> ReadFromStreamAsync(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            return Task.Factory.StartNew(() =>
            {
                using (var xmlr = new XmlTextReader(readStream))
                {
                    var serializer = new DataContractSerializer(type);
                    return serializer.ReadObject(xmlr);
                }
            });
        }

        public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content, TransportContext transportContext)
        {
            var serializer = new DataContractSerializer(type, "Response", "");

            return Task.Factory.StartNew(() =>
            {
                using (var xmlw = new XmlTextWriter(writeStream, Encoding))
                {
                    xmlw.Formatting = Formatting.Indented;
                    serializer.WriteObject(xmlw, value);
                }
            });
        }
    }

解决方法 1:

你能分享更多的细节,为什么你需要创建自定义的 Xml 格式化程序在这里......,因为 Web API 默认 xml 格式化程序似乎是足够你的情况吗?

以下是 XmlWriterSettings 的 Web API XmlMediaTypeFormatter 在写出 xml 时使用。

var writerSettings = new XmlWriterSettings
{
    OmitXmlDeclaration = true,
    CloseOutput = false,
    CheckCharacters = false
};

上述设置使用象...之后你可能也做类似的东西,你的情况。

var xmlWriter = XmlWriter.Create(writeStream, writerSettings);

serializer.WriteObject(xmlWriter, value);

只是供你参考......上面的代码段取自 Web API XmlMediaTypeFormatter ......,你可以看看它的源代码为更多的想法......

官方微信
官方QQ群
31647020