Использование удаленных объектов SPSite и SPWeb

Я был достаточно счастлив, что унаследовал ужасно написанный проект SharePoint.
По-видимому, первоначальный разработчик был большим поклонником повторно используемого кода (30% кода повторно используется в 20 проектах без использования каких-либо библиотек - угадайте, как?).

Я часто нахожу его код вызывающим Common.OpenWeb метод для извлечения SPWeb Объект для работы с SharePoint. Большинство воплощений этой функции выглядят точно так же:

public SPWeb OpenWeb()
{
    String strSiteUrl = ConfigurationManager.AppSettings["SiteUrl"].ToString();
    SPSite site = null;
    SPWeb web = null;
    try
    {
        using (site = new SPSite(strSiteUrl))
        {
            using (web = site.OpenWeb())
            {
                return web;
            }
        }
    }
    catch (Exception ex)
    {
        LogEvent("Error occured in OpenWeb : " + ex.Message, EventLogEntryType.Error);
    }
    return web;
}

И сейчас я очень волнуюсь.
Почему это работает в производстве? Этот метод всегда возвращает удаленный объект, верно?

Насколько она нестабильна?

ОБНОВИТЬ:

Этот метод используется следующим образом:

oWeb = objCommon.OpenWeb();
SPList list = oWeb.Lists["List name"];
SPListItem itemToAdd = list.Items.Add();
itemToAdd["Some field"] = "Some value";
oWeb.AllowUnsafeUpdates = true;
itemToAdd.Update();
oWeb.AllowUnsafeUpdates = false;

Я пропустил глотание try-catch для краткости.
Этот код вставляет значение в список! Это операция записи, я уверен Request свойство используется для этого. Тогда как это может работать?

1 ответ

Решение

Во-первых, короткий ответ: этот метод действительно возвращает удаленный объект. Объект не должен использоваться после удаления, поскольку он больше не находится в надежном состоянии, и любая дальнейшая операция, выполняемая с этим объектом, должна (теоретически) вызвать исключение ObjectDisposedException.

Теперь, немного покопавшись, объекты SharePoint, похоже, не следуют этому правилу. Не только делает SPWeb никогда не бросай ObjectDisposedException после утилизации, но на самом деле он проверяет этот случай в своем Request собственность и восстанавливает действительный SPRequest из своего внутреннего состояния, если он был утилизирован.

Кажется, что по крайней мере SPWeb был разработан, чтобы быть полностью функциональным, даже в удаленном состоянии. Почему я не знаю. Может быть, для размещения клиентского кода, такого как тот, над которым вы работаете. Может быть, это какая-то сложная оптимизация, которую я не могу понять.

Тем не менее, я бы посоветовал вам не полагаться на это поведение, потому что оно может измениться в будущем (хотя, учитывая политику Microsoft в отношении обратной совместимости "ошибка в ошибку", это может не произойти).

И, конечно же, вы все равно будете пропускать новые SPRequest экземпляр, который может быть довольно дорогостоящим. Никогда, никогда не используйте удаленный объект, даже если SharePoint позволяет вам сойти с рук.

Другие вопросы по тегам