【问题标题】:Getting error Error: The given key was not present in the dictionary. in production出现错误 错误:给定的键不在字典中。在生产中
【发布时间】:2012-10-04 17:05:06
【问题描述】:

我正在使用带有 C# Web 服务的 ASP.Net 4.0。这还利用了一个 C# 库,该库在开发和其他应用程序(Skype bot 和 Windows 窗体)中运行良好

我正在使用 JQuery 通过 JSON 与 Web 服务进行通信。在开发中,这工作正常。在生产中,它部分工作。我可以使用一些命令,但其他命令只会抛出此错误:

Error: The given key was not present in the dictionary.

我不确定从哪里开始。我无法单步执行代码,因为它只发生在产品中。我检查了 IIS 日志,每个请求都获得 200 状态,所以它似乎是应用程序本身内部的东西。任何想法从哪里开始?

【问题讨论】:

  • 可能有很多东西。取决于字典的填充方式。如果它是从数据库中填充的,并且您使用不同的数据库进行生产,那可能是您的问题。正如@SLaks 所说,堆栈跟踪会有所帮助。

标签: c# asp.net windows web-services iis


【解决方案1】:

该错误表明服务器端代码正在尝试使用不在该字典中的键访问字典。

我建议修改代码以对所有字典访问进行错误处理。处理错误时,记录试图从字典中读取的键。

记录异常详细信息时,最好记录所有可用信息。

Exception.ToString()

做到了。

【讨论】:

  • 调用Exception.ToString() 可能会更好:它可以为您提供上述所有信息,在某些情况下甚至更多(例如,FileNotFoundException 在适当的情况下包括 FusionLog)。
  • 我添加了错误检查。我在每个代码块周围都放置了 try-catch,但没有抛出异常。
  • @Sugitime:我保证如果您收到该消息,就会在某处引发异常。
  • 是的,你必须是对的。好的,我会继续调查该消息的来源。
  • 好的,所以我更新了 DLL,但由于某种原因,该应用程序仍在使用旧的 DLL。 DLL 未在服务器上注册。即使我删除 DLL 并尝试运行使用它的命令,该命令仍会处理(然后引发错误)。任何想法如何解除这个 DLL 的缓存?
【解决方案2】:

您可以从您正在使用的 sqlsrver 队列中删除所有队列消息,

declare @c uniqueidentifier
while(1=1)
begin
    select top 1 @c = conversation_handle from dbo.yourqueuenqme
    if (@@ROWCOUNT = 0)
    break
    end conversation @c with cleanup
end

它会在那之后工作。

【讨论】:

    【解决方案3】:

    问题是我使用 WebClient 调用需要登录的 URL。我使用我的域凭据设置了我的应用程序池,然后我能够在没有提示登录的情况下调用该页面。

    调用页面后,我可以填充一个列表并循环遍历它。上面的错误被抛出,因为我正在循环一个空列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多