【问题标题】:ASP.NET C# serialize HttpValueCollectionASP.NET C# 序列化 HttpValueCollection
【发布时间】:2011-03-31 07:59:18
【问题描述】:

我正在尝试序列化 Request 对象以用于日志记录。代码

System.Xml.Serialization.XmlSerializer serializer = new System.Xml.Serialization.XmlSerializer(obj.GetType());
// obj is a Request object

给了我以下异常:

To be XML serializable, types which inherit from ICollection must have an implementation of Add(System.String) at all levels of their inheritance hierarchy. System.Web.HttpValueCollection does not implement Add(System.String).

如何解决问题?谢谢。

【问题讨论】:

  • obj 是什么类型?是你的类型吗?
  • 在标题中您说您正在尝试序列化 HttpValueCollection,而在描述中您说的是请求(HttpRequest?)。你能更清楚你的问题吗?

标签: c# asp.net httprequest


【解决方案1】:

简而言之,尝试序列化一个 http 请求对象可能不会很好地结束;即使你解决了当前的问题,我也希望它在更多的地方失败。

您应该以简单的形式构建您自己的对象模型,其中包含您关心的请求部分。对于 HttpValueCollection,您可能需要添加某种类型的基本集合,即名称/值对。

然后:根据实际请求填充您的新模型,并序列化您的模型。

【讨论】:

    【解决方案2】:

    如果您对整个请求(即字节)感兴趣,可以使用HttpRequest.Filter Property。它允许安装一个过滤器(一个派生自 Stream 的对象),该过滤器可以从原始输入 HTTP 请求中读取和写入。

    这是一篇关于这个主题的文章:Filtering HTTP Requests with .NET

    【讨论】:

      【解决方案3】:

      我没有尝试过,但这可能会起作用并且可以序列化。

      HttpContext.Current.Request.GetType()
                      .GetProperties()
                      .Select(
                          a =>
                              new KeyValuePair<object, object>(a, HttpContext.Current.Request.GetType().GetProperty(a.GetType().Name)))
                      .ToList();
      

      【讨论】:

        猜你喜欢
        • 2011-11-22
        • 1970-01-01
        • 2012-06-09
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多