首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Web Api缓存和“无法访问关闭的流”

Web Api缓存和“无法访问关闭的流”
EN

Stack Overflow用户
提问于 2014-04-06 13:42:19
回答 1查看 404关注 0票数 0

我正在尝试使用这个用于asp.net web api (https://github.com/filipw/AspNetWebApi-OutputCache)的缓存库

在安装它之后,我得到了这个错误,并将它缩小到我的XmlMediaTypeFormatter类中的一个类。

代码语言:javascript
复制
Cannot access a closed Stream

我相信这与Task.Factory.StarNew()XmlTextWriterWriteToStreamAsync方法中的某个地方关闭蒸汽有关。有没有其他方法来处理这段代码?

代码语言:javascript
复制
 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);
                }
            });
        }
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-06 14:13:59

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

代码语言:javascript
复制
var writerSettings = new XmlWriterSettings
{
    OmitXmlDeclaration = true,
    CloseOutput = false,
    CheckCharacters = false
};

上述设置的用法就像following...you在您的案例中也可以做类似的事情一样。

代码语言:javascript
复制
var xmlWriter = XmlWriter.Create(writeStream, writerSettings);

serializer.WriteObject(xmlWriter, value);

上面的代码片段取自Web API的XmlMediaTypeFormatter,...you可以看看它的源代码,了解更多想法……

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22890423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档