SPItemEventReceiver上下文SiteId / WebUrl不正确

时间:2010-01-02 06:38:48

标签: c# sharepoint iis wss-3.0 event-receiver

我创建了一个SharePoint事件接收器,它会触发项目更新。 接收者需要访问AfterProperties和ListItem。

使用IP地址(http://10.0.4.50/sites/)从SharePoint Web应用程序触发事件接收器时,在SPItemEventProperties中访问SiteId和WebUrl时会抛出 FileNotFoundException 无法找到http://10.0.4.50/sites/companyName处的Web应用程序。确认您已正确输入网址。

使用主机名触发事件接收器时,在网站集 http://computerhostname/sites/companyName 的设置中指定。这样可以正常工作,不会抛出任何异常。

//Combine Both AfterProperties And ListItem
var ListProperties = new List<KeyValuePair<string, object>>();
ListProperties.AddRange(properties.AfterProperties.ToKeyValue());
ListProperties.AddRange(properties.ListItem.ToKeyValue(p => !p.Sealed));
var AvaliableProperties = ListProperties.Distinct(new KeyValueComparer<object>());

2 个答案:

答案 0 :(得分:1)

这不一定是SharePoint问题,但最有可能取决于在主机上配置IIS的方式。特定站点可以“绑定”到IP地址和主机名,如果浏览器发送的HTTP GET中不存在主机名,则IIS将返回404 NOT FOUND

您可以使用浏览器验证是否可以通过IP地址访问该网站。

如果需要,您可以添加其他绑定,但每个IP地址只能有一个“默认”绑定,因此在(在您的情况下)10.0.4.50只能存在一个站点。

围绕存在多个站点但不能使用主机名的情况的一种可能方法可能是为此IP添加绑定到端口80以外的端口,因此您的URL将变为{{1} }。

答案 1 :(得分:1)

这不仅仅是一个IIS问题,而且还与Sharepoint相关。在SharePoint中进行大量引用是通过使用url作为起点来完成的(只需查看SPSite的构造函数)。然后将URL与SharePoint的Config数据库中的已知URL进行比较。 (以及网站内容数据库中的ofr文件等)。

SharePoint使用名为Alternate Access Mappings的系统为Web应用程序的“区域”(默认,Intranet,Internet,...自定义定义)分配不同的URL。如果它找不到'确切'的Url,内部的东西就会失败(尤其是搜索非常“Url敏感”)。

然后是IIS部分进入游戏:由于IIS可能没有其他站点在80端口上运行,并且没有特定的主机头(因此它默认为machinename),或者将主机头设置为机器名,IIS将选择提出请求并且由于SharePoint与此Web应用程序绑定,SharePoint将尝试处理它,查找URL,Sharepoint找不到Url并且“中断”。

在SharePoint中创建新的Web应用程序时,将hostheader字段留空时会出现no hostheader。