2011-02-14 4 views
4

끔찍하게 작성된 SharePoint 프로젝트를 상속했을만큼 행복했습니다.
원래 개발자는 재사용 가능한 코드를 많이 사용했습니다 (30 %의 코드가 라이브러리를 사용하지 않고 20 개 프로젝트에서 재사용됩니다.).처분 된 SPSite 및 SPWeb 개체 사용

코드를 사용하여 Common.OpenWeb 메서드를 호출하여 SharePoint 항목을 조작하기위한 SPWeb 개체를 검색하는 경우가 자주있었습니다. 이 함수의 화신 대부분은 정확히 같습니다.

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; 
} 

이제 저는 정말로 걱정됩니다.
어떻게 작동합니까? 이 메서드는 항상 폐기 된 객체를 반환합니다.

정확히 어떻게 불안정합니까?

는 UPDATE :이 방법은 다음과 같은 방식으로 사용된다

:

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 속성이이 용도로 사용되고 있음을 확신합니다. 그렇다면 어떻게 작동할까요?

+0

배치 된 객체를 반환하는 것이 불안정 할뿐만 아니라 예외가 기록되고 무시됩니다. –

+2

적어도 메모리는 배가 고프지 않습니다. – rene

+0

메소드는 실제로 폐기 된 객체를 반환합니다. 그 객체에 대한 모든 호출은 이론적으로'ObjectDisposedException'을 던져야합니다. 나는 그것이 결코 작동하지 않았거나 그러한 처분 된 물건에 대한 어떠한 요구도하지 않았다고 의심한다. –

답변

12

첫째, 짧은 대답 :이 메서드는 실제로 처분 된 개체를 반환합니다. 객체는 더 이상 신뢰할 수있는 상태가 아니기 때문에 폐기 된 후에 사용하면 안되며 해당 객체에 대해 수행 된 추가 작업은 (이론적으로) ObjectDisposedException이어야합니다.

이제 조금 파기 한 후 SharePoint 개체가 해당 규칙을 따르지 않는 것처럼 보입니다. 뿐만 아니라 SPWeb 배치 후 ObjectDisposedException가 발생하지 않지만, 실제로 시험이 경우에 대한을 그 Request 속성과가 배치 된 경우 는 내부 상태에서 유효한 SPRequest를 다시 작성합니다.

적어도 SPWeb이었고,은 배치 상태에서도 완벽하게 기능하는 것으로 보입니다. 왜, 나는 모른다. 어쩌면 그것은 당신이 작업하고있는 것과 같은 클라이언트 코드를 수용하기 위해서입니다. 어쩌면 이해할 수없는 복잡한 최적화 일 수 있습니다.

그런데 은 나중에 변경 될 수 있기 때문에에 의존하지 말 것을 제안합니다. (Microsoft의 버그 - 버그에 대한 이전 버전과의 호환성에 대해서는 해당되지 않을 수도 있음).

물론 새 SPRequest 인스턴스가 누출 될 수 있습니다. 이는 값이 비쌀 수 있습니다. SharePoint를 사용하면 폐기 된 개체를 절대 사용하지 마십시오.

+0

설명 답에 감사드립니다. –

+0

배치 된 객체를 사용하면 예외가 발생하지 않습니다. 주요 변수는 SPWeb에 대한 참조를 보유하고있는 동안 메모리 정리를 수행 할 수없는 가비지 컬렉터와 엄청난 양의 메모리를 사용할 수 있다는 것입니다. – devi

+0

전통적으로 셰어 포인트에 대한 지침을 처리하는 것이 좋지 않은데, 완전히 혼란스럽고 종종 틀림없이 틀린 말입니다. 이것은 다른 모든 것이 실패 할 때 "옳은 일"을 수행하는 기존의 해킹입니다. 예, 냄새가납니다. – x0n