Проблема с Web.config. Указанный ключ отсутствует в словаре. - PullRequest
0 голосов
/ 31 января 2011

Я столкнулся с действительно раздражающей проблемой, которая выдает мне эту ошибку: «Указанный ключ отсутствовал в словаре».

Чего я не понимаю, так это того, что он работал идеально, как в прошлую пятницуи дни до этого.Я отладил, проверил, были ли файлы веб-сервиса целы и т.д.Дата создания.Я не знаю, могло ли это что-то изменить, но я могу вспомнить только это.


ASPX.CS

protected void Page_Load(object sender, EventArgs e)
    {
        var listId = Request.QueryString["ListID"];
        var itemId = Request.QueryString["ItemID"];

        try
        {
            var spList = SPContext.Current.Web.Lists[new Guid(listId)];
            var item = spList.GetItemById(int.Parse(itemId));
            var image = (ImageFieldValue)item["PublishingPageImage"];
            var contentType = (string)item["ContentType"];
            var pageLayout = (string) item["PublishingPageLayout"];

            var news = new News
            {
                Title = (string)item["Title"],
                NewsId = item.UniqueId,
                Content = (string)item["PublishingPageContent"],
                ArticleDate = item["ArticleStartDate"] == null ? DateTime.Now : (DateTime)item["ArticleStartDate"],
                PageName = item.File.Name,
                Author = new SPFieldUserValue(SPContext.Current.Web, (string)item["Author"]).User.LoginName,
                IsArticle = contentType.Contains("Article"),
                PageLayout = GetLayout(pageLayout),
                Image = GetImage(image)
            };

            // Jumps to the WSInstance class.
            WSInstance.InternetInstance().PublishNews(news); // This line throws the exception.
            lblMessage.Text = "News '<i>" + news.Title + "</i>' have been published succesfully to the Internet site.";
        }
        catch (Exception ex)
        {
            EventLogger.LogError("Error occured while publishing news: " + ex.Message + "\n" + ex.StackTrace, this);
        }
    }

WSINSTANCE

public static WSIntegration InternetInstance(SPSite spSite)
    {
        // Jumps to the Configuration class.
        var url = Configuration.GetConfigurationValue("Progressive.WS.Internet", spSite);
        ...
        return new WSIntegration
                   {
                       Credentials = new NetworkCredential(username, password, domain),
                       Url = url
                   };
    }

    public static WSIntegration InternetInstance()
    {
        return InternetInstance(SPContext.Current.Site);
    }

КОНФИГУРАЦИЯ

public static class Configuration
{
    public static string GetConfigurationValue(string key, SPSite site)
    {
        var name = site.WebApplication.IisSettings[site.Zone].ServerComment; // This is where it fails and throws the error: "The given key was not present in the dictionary."
        var value = "";
        SPSecurity.RunWithElevatedPrivileges(() => { value = WebConfigurationManager.OpenWebConfiguration("/", name).AppSettings.Settings[key].Value; });
        return value;
    }
}

Секция, в которую он получает данные из файла web.config.

<appSettings><add key="Progressive.WS.Internet" value="http://shpt02/_layouts/DR/WSIntegration.asmx" /> // This is the key value it cannot find.
<add key="Progressive.WS.Internet.Username" value="user" />
<add key="Progressive.WS.Internet.Password" value="password" />
<add key="Progressive.WS.Internet.Domain" value="domain" /></appSettings>

Ответы [ 2 ]

1 голос
/ 31 января 2011

Ошибка говорит о том, что он не может найти Зону сайта в словаре IisSettings.Вы должны проверить как значение свойства Zone, так и содержимое словаря IisSettings.Они могут не содержать ожидаемых вами значений, так как вы обращаетесь к IisSettings вне RunWithElevatedPrivileges, т.е.с правами доступа конечного пользователя.

В любом случае сохранение настроек приложения в web.config - не лучший вариант в SharePoint, поскольку в веб-приложении размещается множество семейств сайтов и сайтов.Его изменение приводит к перезапуску и перекомпиляции всех сайтов - не очень удобно для конечного пользователя!

Проверьте раздел Диспетчер настроек приложения в Руководстве по Sharepoint 2010 для альтернативного способа сохранения настроек всоответствующая сумка собственности сайта.

0 голосов
/ 31 января 2011

Увидел комментарий Стива и согласен, что любые указатели на то, где происходит ошибка, были бы хорошими. Это Silverlight (или WPF)? Если это так, это может быть имя стиля, которое вы использовали в своем XAML, которого нет в словаре. Внимательно проверьте имена и определите, есть ли здесь проблема.

Оба возможных места для решения проблемы. Проблемы с именами часто пропускаются при запуске кода.

...