SPC110261: Close PublishingWeb created by PublishingWeb.GetPublishingWebs[] index operator

The GetPublishingWebs method of the PublishingWeb class returns a PublishingWebCollection object. You must call the Close method on each enumerated innerPubWeb object. When you are calling only the GetPublishingWeb method, you are not required to call Close.

TypeName: ClosePublishingWebCreatedByPublishingWebGetPublishingWebsIndex
CheckId: SPC110261
Severity: CriticalWarning
Type: AssemblyFileReference
Resolution

The GetPublishingWebs method of the PublishingWeb class returns a PublishingWebCollection object. You must call the Close method on each enumerated innerPubWeb object. When you are calling only the GetPublishingWeb method, you are not required to call Close. See sample from MSDN:

Bad Coding Practice

void PublishingWebCollectionLeak()
{
  using (SPSite siteCollection = new SPSite("http://moss"))
  {
    using (SPWeb web = siteCollection.OpenWeb())
    {
      // Passing in SPWeb object that you own, no dispose needed on
      // outerPubWeb.
      PublishingWeb outerPubWeb = PublishingWeb.GetPublishingWeb(web);
      
      PublishingWebCollection pubWebCollection = outerPubWeb.GetPublishingWebs();
      foreach (PublishingWeb innerPubWeb in pubWebCollection)
      {
        // innerPubWeb leak.
      }
      // PublishingWeb will leak for each innerPubWeb referenced
    } // SPWeb object web.Dispose() automatically called.
  } // SPSite object siteCollection.Dispose() automatically called.
}

Good Coding Practice
void PublishingWebCollectionNoLeak()
{
  using (SPSite siteCollection = new SPSite("http://moss"))
  {
    using (SPWeb web = siteCollection.OpenWeb())
    {
      // Passing in SPWeb object that you own, no dispose needed on
      // outerPubWeb.
      PublishingWeb outerPubWeb = PublishingWeb.GetPublishingWeb(web);
      PublishingWebCollection pubWebCollection = outerPubWeb.GetPublishingWebs();
      foreach (PublishingWeb innerPubWeb in pubWebCollection)
      {
        try
        {
          // ...
        }
        finally
        {
          if(innerPubWeb != null)
            innerPubWeb.Close();
        }
      }
    }  // SPWeb object web.Dispose() automatically called.
  } // SPSite object siteCollection.Dispose() automatically called.
}

Remarks

Rule relates to SPDisposeCheckId 'SPDisposeCheckID_300'. To ignore this rule add the attribute '[SPDisposeCheckIgnore(SPDisposeCheckID.SPDisposeCheckID_300, "Caller will dispose")]' to your method.

Links

comments powered by Disqus