Использование удаленных объектов SPSite и SPWeb - PullRequest
4 голосов
/ 14 февраля 2011

Я был достаточно счастлив, что унаследовал ужасно написанный проект 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 Ответ

12 голосов
/ 15 февраля 2011

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

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

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

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

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

...