page. checkout()抛出SPException:即使页面存在URL也是无效的

本文关键字:URL 存在 无效 checkout 抛出 SPException page | 更新日期: 2023-09-27 18:02:10

我正在为SharePoint站点编写一个事件接收器,我希望这个接收器在创建基本页面后编辑其内容。下面是给我问题的函数:

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'.
        ...
    }
}

pagexists函数只是使用一个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;
    }
}

CheckOut函数返回:"SPException: The URL '…"是无效的。它可能指向一个不存在的文件或文件夹,也可能指向一个不在当前Web中的有效文件或文件夹。"此外,我在包含'page. checkout()'的行中添加了一个断点,并检查了该page变量,发现它的所有成员都抛出了一个'System.IO '。FileNotFoundException'或'System. error '。IndexOutOfRangeException',即使它指向正确的URL。我还检查了HttpWebRequest是否指向正确的URL,正如评论中提到的,在代码可以尝试检查它之前,我检查了页面是否存在于我的浏览器中。

从我所做的搜索中,我发现这个错误经常在数据库日志被填满时抛出。但从我发现的情况来看,在这种情况下,当试图从SharePoint网站本身签出文档时,也会出现这个错误,而我没有遇到过这个问题;只有在尝试从事件接收器签出页面时才会得到此错误。知道是怎么回事吗?

page. checkout()抛出SPException:即使页面存在URL也是无效的

我找到了这篇文章

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