C# page.CheckOut()抛出异常:即使页面存在,URL也无效

C# page.CheckOut()抛出异常:即使页面存在,URL也无效,c#,sharepoint,C#,Sharepoint,我正在为SharePoint网站编写事件接收器,希望此接收器在创建基本页面后编辑其内容。以下是给我带来问题的函数: public void FillPage(SPSite site, SPItemEventProperties properties, string pageName) { using (site) { // Wait until the page has been generated while (!PageExists(prope

我正在为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'.

        ...
    }
}
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:URL“…”无效。它可能引用了不存在的文件或文件夹,或者引用了当前Web中不存在的有效文件或文件夹。”此外,我在包含“page.CheckOut()”的行中添加了一个断点,并检查了该页面变量,发现它的所有成员都抛出一个“System.IO.FileNotFoundException”或“System.IndexOutOfRangeException”,即使它指向了正确的URL。我还检查了HttpWebRequest是否指向正确的URL,正如注释中所述,在代码尝试签出之前,我会检查浏览器中是否存在该页面

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

我找到了这篇文章

这说明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;
        }
    }
}

你应该试试看

以防万一,您要覆盖的事件是什么?ItemAdded?您正在使用
BeforeUrl
的事实让我们假设您正在使用
ItemAdding
事件,而不是
ItemAdded
。因此,您是在页面创建过程中捕获事件,而不是在创建之后捕获事件。所以URL存在,但它还不在您的页面库中。您是否尝试评估
页。是否存在
?这可能是假的。请考虑使用<代码> ItEngult事件。@西尔文:我正在使用ItMeMead。也就是说,关于LInsoDeTeh的评论,我使用BeforeUrl而不是AfterUrl的主要原因是AfterUrl一直返回null,即使我在浏览器中确认页面存在。page.Exists也返回false,但这没有意义,因为当我在浏览器中查看页面时,它返回false,因此它显然确实存在。谢谢!我尝试了一下这段代码,它最终给了我一些我一直遇到的问题,但在那个博客上也有一些示例说明了GetFile的行为,并且使用其中的一个就可以了。