2015-07-10 59 views
2

我正在爲SharePoint網站編寫事件接收器,並且我希望此接收器在創建基本頁面後編輯其內容。這是給我的問題的功能:page.CheckOut()拋出SPException:即使存在頁面,URL也無效

public void FillPage(SPSite site, SPItemEventProperties properties, string pageName) 
{ 
    using (site) 
    { 
     // Wait until the page has been generated 
     while (!PageExists(properties.BeforeUrl)) 
     { 
      Thread.Sleep(10000); 
     } 

     Thread.Sleep(30000);  // Added so I can check that the URL exists in my browser 

     SPWeb web = site.RootWeb; 
     SPFile page = web.GetFile(properties.BeforeUrl); 
     page.CheckOut();   // Throws SPException: 'URL is invalid'. 

     ... 
    } 
} 

的PageExists功能只需使用一個HttpWebRequest的指着剛生成的頁面:

public bool PageExists(string url_ending) 
{ 
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri((the root site URL) + url_ending)); 
    request.Timeout = 15000; 
    try 
    { 
     HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
     return true; 
    } 
    catch (WebException we) 
    { 
     if (we.Message.Contains("Unauthorized")) 
     { 
      return true; // If it's an authorization error, the page exists but access was denied 
     } 

     return false; 
    } 
} 

結帳函數返回:「SPException:網址'...'是無效的,它可能引用不存在的文件或文件夾,或引用不在當前Web中的有效文件或文件夾。「另外,我在包含'page.Checkout()'的行添加了一個斷點,並檢查了該頁面變量,並發現它的所有成員都會拋出'System.IO.FileNotFoundException'或'System.IndexOutOfRangeException',儘管它指向了正確的URL。我還檢查了HttpWebRequest是否指向了正確的URL,正如我在瀏覽器中查看該註釋中提到的那樣,在代碼嘗試檢查它之前,該頁面在我的瀏覽器中存在。

從我做了什麼搜索,我發現這個錯誤通常是在數據庫日誌填滿時拋出的。但是從我發現的情況來看,在這種情況下,嘗試從SharePoint網站中檢出文檔時也會發生此錯誤,並且我沒有遇到該問題;當我嘗試從事件接收器中檢出頁面時,我只會遇到此錯誤。任何想法發生了什麼?

+0

爲了以防萬一,您壓倒一切的事件是什麼? ItemAdded? –

+0

您使用'BeforeUrl'的事實讓我假設您使用ItemAdding事件而不是ItemAdded。所以你在頁面創建過程中捕獲事件,而不是在創建之後。所以URL存在,但它不在你的頁面庫中。你有沒有嘗試評估'page.Exists'?這可能是錯誤的。考慮使用'ItemAdded'事件。 – LInsoDeTeh

+0

@Sylvain:我正在使用ItemAdded。這就是說,關於LInsoDeTeh的評論,我使用BeforeUrl而不是AfterUrl的主要原因是因爲AfterUrl一直返回null,即使我已經在瀏覽器中確認頁面存在。 page.Exists也返回false,但這沒有任何意義,因爲它在瀏覽器中查看頁面時返回false,所以顯然確實存在。 – mpross

回答

0

我發現這篇文章

http://blog.mastykarz.nl/inconvenient-spwebgetfilestring/

這解釋了的GetFile可以有意想不到的效果。

提供了一種解決辦法:

using (SPSite site = new SPSite("http://moss")) 
{ 
    using (SPWeb web = site.RootWeb) 
    { 
     object o = web.GetFileOrFolderObject("/site/subsite1/Pages/default.aspx"); 
     if (o is SPFile) 
     { 
      SPFile f = (SPFile)o; 
     } 
    } 
} 

你應該給它一個試試吧!

+1

謝謝!我嘗試了一下這段代碼,結果給了我一些同樣的問題,但是在那個博客上也有一些GetFile如何運行的例子,並且使用其中的一個工作得很好。 – mpross

相關問題