我正在为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;
}
}
CheckOut函数返回:“SPException:URL'...'无效。它可能指的是不存在的文件或文件夹,或者引用当前Web中不存在的有效文件或文件夹。”另外,我在包含'page.Checkout()'的行中添加了一个断点并检查了该页变量,发现它的所有成员都抛出'System.IO.FileNotFoundException'或'System.IndexOutOfRangeException',即使它指向正确的URL。我还检查了HttpWebRequest是否指向了正确的URL,正如我在检查中所提到的那样,在代码可以尝试检查之前我检查该页面是否存在于我的浏览器中。
从我的搜索中,我发现当数据库日志填满时,通常会抛出此错误。但是从我发现的情况来看,在这种情况下,当尝试从SharePoint站点本身签出文档时也会发生此错误,而我没有遇到过这个问题;当我尝试从事件接收器检出页面时,我只收到此错误。知道发生了什么事吗?
答案 0 :(得分: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;
}
}
}
你应该试一试!