C# 记录整个SOAP请求还是只记录其中的参数?

C# 记录整个SOAP请求还是只记录其中的参数?,c#,.net,wcf,sqlite,logging,C#,.net,Wcf,Sqlite,Logging,我有一个同步应用程序,它每10秒向web服务发送一次请求,并在本地数据库中进行一些数据转换,反之亦然。为了方便和解决一些争议,我想记录任何一对请求和响应SOAP消息 但我的经验告诉我,用同样的请求和响应填充SQLite数据库需要很大的空间 如何用更少的磁盘空间实现相同级别的日志详细化? 事实上,记录整个消息有好处吗?也许我们可以剪切参数值并记录它,而不是完整的消息 也许还有另一种机制可以压缩消息(或者扩展/获取包含部分数据的完整消息?)并存储较少的数据,但能够在需要的地方获取源消息 样本: 请求

我有一个同步应用程序,它每10秒向web服务发送一次请求,并在本地数据库中进行一些数据转换,反之亦然。为了方便和解决一些争议,我想记录任何一对请求和响应SOAP消息

但我的经验告诉我,用同样的请求和响应填充SQLite数据库需要很大的空间

如何用更少的磁盘空间实现相同级别的日志详细化? 事实上,记录整个消息有好处吗?也许我们可以剪切参数值并记录它,而不是完整的消息

也许还有另一种机制可以压缩消息(或者扩展/获取包含部分数据的完整消息?)并存储较少的数据,但能够在需要的地方获取源消息

样本: 请求:


abcdef
答复:

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <GetModifiedItemsResponse xmlns="http://tempuri.org/">
         <GetModifiedItemsResult xmlns:a="http://schemas.datacontract.org/2004/07/Exchange" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:Body i:type="a:lst">
               <a:List>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>1</a:ID>                     
                     <a:SYSUSER>b2</a:SYSUSER>
                  </a:BaseItem>
                  <a:BaseItem i:type="a:asd">
                     <a:ISDELETED i:nil="true"/>
                     <a:ID>2</a:ID>
                     <a:SYSUSER>b3</a:SYSUSER>
                  </a:BaseItem>
               </a:List>
            </a:Body>
            <a:Msg>SUCCESS</a:Msg>
         </GetModifiedItemsResult>
      </GetModifiedItemsResponse>
   </s:Body>
</s:Envelope>

1.
b2
2.
b3
成功

好的。将WCF设置为记录所有内容非常简单。给出了一个例子。您想要使用IMessageInspector接口

至于问题的第二部分。使用大量的数据存储。我有两个答案给你。您将使用大量的数据存储,因为

  • 每条消息都很大(不知道XML的数据存储效率)
  • 您正在存储大量消息
  • 因此,您希望减少每个部分的贡献

    第一,正如你正确地猜测的那样。您可以通过压缩数据来减少有效负载大小。从简单信息理论我们知道数据的可压缩性取决于数据的性质。在本例中,XML可以轻松压缩

    其次,您可以减少有效负载的数量。通过定期截断存储请求的数量,可以限制存储空间

    然而,我最后想指出的是,我绝对不会使用SQLite作为存储机制。根据我的经验,P/Invoke开销将严重限制服务器的性能。此外,SQLite的并发模型非常差,这也限制了服务器上并发请求的数量

    坦率地说,我必须问一下,如果您需要查询,您是否需要仅使用平面文件进行存储,或者我可能建议您切换到XMLNoSQL解决方案

    使用XMLNoSQL数据库的另一个好处是,即使在应用程序服务器停机时,您也可以将其置于框外并查询它


    现在,至于您是应该从XML中提取数据,还是以不兼容的格式存储数据……我认为这会适得其反。通过存储实际请求,您可以编写一个小应用程序,将请求重新发送到回归测试。

    在我看来,解决方案取决于您是要存储整个消息还是只跟踪呼叫和一些其他数据

    如果您不必存储整个消息,我绝对建议您安装。AppFabric是一组集成的技术,可以更轻松地执行许多操作,包括监视IIS上托管的WCF服务,而且是免费的!。AppFabric的设置非常简单,可以为IIS添加新的功能/图标

    我们在生产环境中使用AppFabric+SQL Server Express来跟踪一些WCF调用。启用跟踪非常简单;您可以设置跟踪级别、目标数据库、要保留多少历史记录、大小限制等等……此外,还有一个非常酷的用户界面,可以让您查询存储的所有跟踪(它显示跟踪了多少调用、失败了多少……)。好的是,在出现错误调用的情况下,您可能会有错误描述。也可以在AppFabric跟踪中添加用户定义的数据。更多信息

    现在,如果您需要存储整个消息,正如@Aron所说,我会选择使用NoSQL,尤其是使用。 如其网站上所述:

    logstash是一种用于管理事件和日志的工具。你可以用它来 收集日志,解析它们,并将它们存储起来以备将来使用(例如 搜索)。说到搜索,logstash附带了一个web界面 用于搜索和钻取所有日志

    logstash基于elasticsearch

    最后一件事是定义存储消息的正确时间/地点,可能是使用自定义WCF行为


    希望有帮助

    压缩XML最简单的方法是一次存储多个文档,并对其应用您选择的任何通用压缩算法。关键是一次压缩多条消息,以便压缩器可以利用重复XML结构中存在的极端冗余

    这工作得非常好,因此通常不需要专门的XML压缩。像“gzip/deflate”这样的普通算法或像LZMA(7zip)这样更强大的算法非常非常擅长利用这一点。它们所做的就是组合重复的子字符串(就像它们在XML中一样)


    因此,您可以将所有XML消息缓冲10秒钟,并将它们保存在某个二进制blob中。

    日志有两个主要用途:

  • 出现应用程序问题时进行调试/跟踪
  • 审计跟踪
  • 要实现这些目标,您需要尽可能多地记录可用的日志。因此,记录整个SOAP消息。 为了节省磁盘空间,您可以将间歇性压缩并定期存档的文件存储在适当命名(包括日期和时间)的平面文件中


    祝你好运。希望这有帮助

    NoSQL看起来不错。但我可以将其用作非客户机-服务器工具吗?我选择SQLite是因为我
    <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
       <s:Body>
          <GetModifiedItemsResponse xmlns="http://tempuri.org/">
             <GetModifiedItemsResult xmlns:a="http://schemas.datacontract.org/2004/07/Exchange" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
                <a:Body i:type="a:lst">
                   <a:List>
                      <a:BaseItem i:type="a:asd">
                         <a:ISDELETED i:nil="true"/>
                         <a:ID>1</a:ID>                     
                         <a:SYSUSER>b2</a:SYSUSER>
                      </a:BaseItem>
                      <a:BaseItem i:type="a:asd">
                         <a:ISDELETED i:nil="true"/>
                         <a:ID>2</a:ID>
                         <a:SYSUSER>b3</a:SYSUSER>
                      </a:BaseItem>
                   </a:List>
                </a:Body>
                <a:Msg>SUCCESS</a:Msg>
             </GetModifiedItemsResult>
          </GetModifiedItemsResponse>
       </s:Body>
    </s:Envelope>