对sharepoint 的form library的事件进行处理(二)开发事件处理程序

来源:互联网 发布:淘宝优惠券怎么来的 编辑:程序博客网 时间:2024/04/30 00:28

对sharepoint 的form library的事件进行处理(二)开发事件处理程序

一、代码
事件处理程序需要实现IListEventSink接口。这个接口只有一个必须实现的方法public void  OnEvent(SPListEvent listEvent)。所有的处理都在这里完成。
public void  OnEvent(SPListEvent listEvent)
{

}

1。如何访问library的field
SharePointWeb  = listEvent.Site.OpenWeb();
if (listEvent.UrlAfter != null)
{
  SharePointEventItem = SharePointWeb.GetFile(listEvent.UrlAfter);
  oItem = SharePointEventItem.Item;
}
else
{
  return;
}
int ProjectID= System.Convert.ToInt32(oItem["ProjectID"].ToString());

2。delete事件的特殊性
不是所有的事件中都可以取到field的值。sharepoint的delete事件是在list中的文档被删除后才被触发的,因为这时实际数据已经被删除了,所以此时对oItem["ProjectID"]访问会议发异常。
不过,天无绝人之路,Delete事件中还有可以利用的信息。就是listEvent.ListID和istEvent.UrlBefore。(ListID是library的唯一标示,而UrlBefore是被删除文档的路径名。)

在Insert事件中,记录下listEvent.ListID和listEvent.UrlAfter和Event的对应关系
   Barsvr.UpdateEventLink(listEvent.ListID.ToString() ,listEvent.UrlAfter ,ProjectID);
在delete事件中,根据listEvent.ListID和listEvent.UrlBefore找到对应的Event,并删除。
   Barsvr.DeleteEvent(listEvent.ListID.ToString(),listEvent.UrlBefore);  

3. 对sharepoint数据的访问需要身份验证。
事件处理程序是在sharepoint的appicaition pool下运行。一般情况下,sharepoint的appicaition pool运行的账号没有权限访问library的数据。所以需要模拟用户身份来访问。
WindowsImpersonationContext wip=null;
try
{
 wip = null;
 //Impersonate the appropriate user
 WindowsIdentity id = CreateIdentity("username","domain","passsword");
 if (id != null)
 {
  wip = id.Impersonate();
  。。。。开始访问sharepoint数据
 }
}
catch(Exception ex)
{
 System.Diagnostics.EventLog.WriteEntry("Event Log Test Error3", ex.Message , System.Diagnostics.EventLogEntryType.Information, 0 );
}
finally
{
 //Cleanup
 if (wip != null)
  wip.Undo();
}

4 对WEB SERVICE调用需要数字证书
BarServices.Service  Barsvr = new BarServices.Service();
System.Net.CredentialCache cache = new System.Net.CredentialCache();
cache.Add(new Uri(Barsvr.Url), "Negotiate", new System.Net.NetworkCredential("username","password","domain"));
Barsvr.Credentials = cache;
Barsvr.DeleteEvent(listEvent.ListID.ToString(),listEvent.UrlBefore);  


二、GUID,strong name和版本号
这里是AssemblyInfo.cs的有关内容,
[assembly: Guid("F4E70578-3443-4ff3-98F2-6A69147BB687")]
[assembly: AssemblyVersion("1.0.0.48")]
[assembly: AssemblyFileVersion("1.0.0.48")]
[assembly: AssemblyKeyFile(@"D:/ctc/Ops/EWS/Bar/WSS/BarEventSink/reference/BarEventSink.snk")]

1 生成GUID, 在Visual Studio, Tools->Create GUID. 选registry format. 选new GUID.
2 生成strong name, 用sn工具生成strong name
3 为了系统维护,一定要管理好版本号。