【问题标题】:Pass information from SoapExtension to WebMethod将信息从 SoapExtension 传递到 WebMethod
【发布时间】:2011-04-26 17:42:50
【问题描述】:

我目前有大量的 ASMX Web 服务,它们通过将传入和传出对象序列化为 xml 并将该 xml 存储在我的数据库中来记录传入和传出对象;该日志记录过程发生在 Web 方法本身中。(我知道。我知道。我应该使用 WCF,我正试图将那个球推上山,但我的组织又老又慢)

比起序列化对象,我更愿意只使用 Soap 扩展并记录它们发送的整个 SOAP 消息以及我返回的整个 SOAP 消息。以Microsoft's example 为基础,我的效果很好。我的问题是,当我将 SOAP 请求记录到数据库时,我会生成一个与该请求匹配的唯一键,并可用于在数据库中查找该请求。我想将该密钥传递给我的 web 方法,以便它可以用于记录与请求相对应的其他信息(错误、指标等)。但是,我无法找到一种方法来获取 Web 方法的密钥,以便 Web 方法可以在数据库中存储有关请求的附加信息。

这可能吗?如果可以,最好的方法是什么?

感谢您的宝贵时间。

【问题讨论】:

    标签: .net asp.net web-services asmx


    【解决方案1】:

    您应该考虑使用CorrelationManager 类进行日志记录。您将在 SoapExtension 中对请求启动逻辑操作,并在相应回复时停止它。然后,您的日志应显示完全匹配的回复请求,包括您要记录的其他信息。

    唯一 ID(GUID)将以 Trace.CorrelationManager.ActivityId 的形式提供。

    【讨论】:

    • 我喜欢使用这个类的想法;我以前从未使用过它。我必须解决的一个问题是我在 Oracle 上,并且 .NET GUID 在索引时的性能不如 Oracle 序列。我可以通过将 GUID 临时存储在我用于响应 XML 的列中,直到最后一次实际存储返回给用户的最终 XML 的操作来使用 GUID。
    • 也许我可以创建一个静态字典,将 GUID 与我的 Oracle 序列值相关联。
    • @Zach:你可以,但是这些数据会被如此频繁地访问以至于索引性能是一个问题吗?
    • 一旦它与我不想与 DBA 争夺一个月来更改列数据类型的愿望结合起来就足够了(同样,我的组织又旧又慢)。我实现了一个线程安全字典(来自这里的信息:stackoverflow.com/questions/157933/…),到目前为止,我正朝着一个好的方向前进。感谢您的帮助。
    【解决方案2】:

    为什么不只是有一个全局标志(或更复杂的东西来防止多线程问题),在服务器端soap扩展中将它设置为当前请求ID并在服务器端方法中读取它?

    【讨论】:

    • 线程安全正是我担心使用某种类型的全局标志的原因。我可以同时进行许多呼叫,并且我需要确保 global 在所有呼叫中都是安全的。
    猜你喜欢
    • 1970-01-01
    • 2011-09-11
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多