【问题标题】:Serializing MethodBase and Exception types in a WebMethod在 WebMethod 中序列化 MethodBase 和 Exception 类型
【发布时间】:2011-05-06 20:58:50
【问题描述】:

我们正在尝试创建一个简单易用的网络服务来记录异常和消息。

理想情况下,Web 方法声明应如下所示

public int LogException(MethodBase methodBase, Exception exception)
public int LogMessage(MethodBase methodBase, string message, string data)

但这不起作用,因为当您添加对 Web 服务的引用时,它会创建自己的类,并且 System.Reflection.MethodBase 与 LogService.MethodBase 的类型不同。 MethodBase 或 Exception 都不能很好地序列化。而且我还希望异常具有它的数据值。

您将如何将这两个对象传递给网络方法?

我们希望只传递这两个对象的原因是,在它们之间,我们可以获得跟踪错误所需的 99% 的数据。它们包含堆栈跟踪信息、方法名和它们所在的类等……通过向 Exception.Data 添加一些信息,您可以在调用时获得参数值。而且,这简化了对其他开发人员的调用,并希望使他们更有可能使用通用记录器,而不是总是滚动自己的记录器。目前,事实证明这很麻烦,因为每个记录器都不同,而且大多数似乎没有包含追踪错误所需的所有详细信息。

通过这样做,我们可以标准化返回的值和电子邮件格式,并通过更改一项服务来更改所有应用程序的日志记录。

【问题讨论】:

    标签: .net exception serialization logging asmx


    【解决方案1】:

    请不要这样做。

    您不应使用网络服务来传递特定于平台的数据。 MethodBase 等是特定于 .NET 的,而 Web 服务基础架构并不适合它。

    为什么要让 Web 服务进行日志记录?请改用类库。您不希望日志记录因 Web 服务问题而失败。

    最后,如果您必须这样做,请不要使用 ASMX Web 服务来执行此操作 - 使用 WCF,这将允许您在客户端和服务上使用相同的类型。

    也许更重要的是,WCF 将允许您使用 MSMQ 作为传输,这样您就可以使用可靠的队列来确保最终记录您的日志消息。

    我仍然怀疑您是否真的要发送 MethodBase - 而是发送 MethodBase 中的数据。您将如何处理 .NET 版本依赖项?

    【讨论】:

    • 哦,我同意。可悲的是,我工作的地方“一切都必须通过网络服务”。不过 WCF 可能会起作用。
    • 这很愚蠢,真的。如果网络出现问题,您将无法记录网络出现问题的事实。至少有一个回退,这样您就可以将您的失败记录到本地 Windows 事件日志中。
    • 我更改为 WCF 服务,但现在我仍然遇到序列化问题。见:stackoverflow.com/questions/4135493/…
    猜你喜欢
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2021-12-03
    • 1970-01-01
    • 2019-01-21
    相关资源
    最近更新 更多