【问题标题】:"System.Web.HttpContext cannot be serialized because it does not have a parameterless constructor."“System.Web.HttpContext 无法序列化,因为它没有无参数构造函数。”
【发布时间】:2010-12-15 23:39:55
【问题描述】:

我创建了一个 Web 服务,其他网站可以使用它在我的数据库中存储错误。然后,他们可以访问我的站点来查看他们的错误、搜索错误、过滤错误等。但是,我的 Web 服务出现以下错误:


System.Web.HttpContext 无法序列化,因为它没有无参数构造函数。

说明:在执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.InvalidOperationException:System.Web.HttpContext 无法序列化,因为它没有无参数构造函数。


网络服务包含以下功能:

[网络方法] public static void LogError(HttpContext context, Exception exception, string APIKey) { //记录错误 }

使用 Web 服务记录异常的外部站点在 global.asax 文件中包含以下代码:

void Application_Error(对象发送者,EventArgs e) { // 发生未处理错误时运行的代码 WebService.Errors.ErrorHandler.LogError(HttpContext.Current, Server.GetLastError(), "NOLDFHOI"); }

如何从他们的网站将 HttpContext 从 Web 服务中获取到我的函数中?

【问题讨论】:

    标签: c# asp.net web-services serialization httpcontext


    【解决方案1】:

    您将无法序列化 HttpContext。您最好的选择是创建一个自定义类来封装您想要从 HttpContext 中取出的信息并将其传递给您的 WebMethod。

    【讨论】:

    • +1 完全正确 - 这也会向来自 ASP.NET 应用程序的调用者开放该方法。 Winforms 应用程序没有 HttpContext,因此永远不能调用此“LogError”方法——就设计而言,这不是您的最佳选择...
    • @Joseph:这个自定义类会是什么样子?它在寻找什么样的参数? “封装信息”到底是什么意思?
    • @rohanbk 这将是一个 POCO 类,它只具有包含您想要的信息的属性。您将设置属性(通过 HttpContext),然后通过网络使用该类(因为您应该能够将 POCO 标记为可序列化)
    【解决方案2】:

    您需要创建一个可序列化的类,用于保存您希望收集的信息。然后在该类上创建静态方法,该方法将创建该类的新实例并收集所需的信息。

    它将被传递给 LogError 的这个新类。

    【讨论】:

    • 该类是包含在我的 Web 服务中还是包含在外部站点中?我宁愿不必告诉客户添加更多代码。
    • 它必须在外部站点上,它是可以访问上下文的站点。
    猜你喜欢
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2015-09-13
    相关资源
    最近更新 更多