Невозможно привести объект типа 'System.String' к типу 'System.Collections.Hashtable' - PullRequest
1 голос
/ 06 октября 2010

Я получаю эту ошибку при преобразовании переменной уровня приложения в Hashtable;

Первый в Global.aspx файле, который я храню Hashtable в переменной приложения, например:

Hashtable htErrorDescription = new Hashtable();
htErrorDescription.Add("Error 1","General Error");
htErrorDescription.Add("Error 2","Service Error");

context.Application["htErrorDescription"] = htErrorDescription + "";

После этого я хочу получить эту Hashtable из переменной уровня приложения обратно.

Hashtable htOutput;
htOutput = (Hashtable)context.Application["htErrorDescription"];

Я получаю эту ошибку.

Пожалуйста, помогите мне выйти из этой ошибки, Спасибо заранее.

Ответы [ 3 ]

4 голосов
/ 06 октября 2010

Когда вы делаете:

Application["Application["htErrorDescription"] = htErrorDescription + "";

Он неявно преобразует htErrorDescription в строку.Вам нужно избавиться от:

+ ""

Кроме того, я не думаю, что это даже компилируется, разве вы не пропускаете закрывающий символ ], и вы вкладываете кавычки без использования обратной косой чертычтобы избежать их?

РЕДАКТИРОВАТЬ: Я вижу, вы редактировали свой вопрос, поэтому все, что вам нужно сделать сейчас, это удалить + "".

1 голос
/ 06 октября 2010

Во-первых, прекратите конкатенацию словаря со строкой, так как это означает, что то, что вы храните в коллекции приложений, является результатом Hashtable.ToString(), который является просто строкой "System.Collections.Hashtable".

Это всего лишь ошибка, ваша большая проблема заключается в том, что вы храните словарь ошибок от конкретной операции в области приложения.

Рассмотрим два человека (Алиса и Боб, просто чтобы быть традиционными), получающих доступ квеб-приложение в то же время.IIS берет два запроса из своей очереди запросов, назначает рабочий поток для обработки каждого из запросов, и пока все в порядке.

Операция Алисы проверяет, что ее учетная запись оплачена.Это не так, создается таблица ошибок, мы добавляем ошибку с описанием «Учетная запись не оплачена» и присваиваем ее переменной приложения.

Тем временем операция Боба пытается создатьделовая встреча, но он допустил ошибку и установил ее на последний месяц, поэтому ошибка, в которой говорится, что «вы не можете создать деловую встречу в прошлом», присваивается новой таблице ошибок и присваивается переменной области приложения.

Это происходит примерно в одно и то же время, так что это практически случайно относительно того, что сейчас находится в таблице ошибок.

Алиса теперь представлена ​​с сообщением об ошибке.Может быть, это правильный, или, может быть, его бессмыслица о деловых встречах в прошлом, которые ничего не значат для нее.Есть хороший шанс, что Алиса жалуется на технику.

Тем временем Бобу также выдается сообщение об ошибке.Может быть, это правильный, или, может быть, его жалобы, что он не оплатил свои счета, когда он знает за факт, что у него есть.Есть хороший шанс, что Боб жалуется на выставление счетов или его прямое обращение в компанию, управляющую веб-сайтом.Вероятно, это будет хуже, чем он жаловался технику.

Если вам нужно передать объект на более позднюю часть обработки того же веб-запроса, используйте свойство Items в HttpContext.

0 голосов
/ 06 октября 2010

Поместите объект в Application так:

context.Application["htErrorDescription"] = htErrorDescription;
...