2007年12月14日

2007年12月13日

2007年12月6日

Sharepoint 2003里有文档讨论板的功能,但到2007不知道怎么没有了。所以做了一个
怎么发的图片会这么大,重新上传提示同名,又不知道在哪里删除图片。
安装
stsadm -o addsolution -filename BruceLeeDocumentDiscussion.wsp
stsadm -o deploysolution -name BruceLeeDocumentDiscussion.wsp -immediate -allowGacDeployment -force
stsadm.exe -o installfeature -name BruceLeeDocumentDiscussion -force
stsadm -o activatefeature -filename BruceLeeDocumentDiscussion\feature.xml -url http://brucelee:8088 -force
然后-网站操作-〉网站设置—〉修改所有网站设置-〉网站管理-〉网站功能-〉激活文档讨论板
把BruceLee.DocumentDiscussion.dll拷贝到你的网站的Bin目录下

反安装
STSADM -o deactivatefeature -filename BruceLeeDocumentDiscussion\feature.xml -url http://brucelee:8088 -force
STSADM -o uninstallfeature -filename BruceLeeDocumentDiscussion\feature.xml -force
stsadm -o retractsolution -name BruceLeeDocumentDiscussion.wsp -immediate
stsadm -o deletesolution -name BruceLeeDocumentDiscussion.wsp  -override



/Files/BruceLee521/DocumentDiscussion.rar

posted @ 2007-12-06 00:31 Bruce Lee 阅读(382) | 评论 (3)编辑

2007年12月3日

你可能知道当工作流到了持久化点Sharepoint会持久化工作流状态.

然而Sharepoint WF宿主是不使用缺省的WF运行时的持久化服务的,你没有看到持久化数据库作为Sharepoint 2007的安装部分。怎样看Sharepoint 2007持久化长时间运行的工作流状态呢。

Sharepoint 2007的工作流持久化服务是被作为SPWinOePersistenceService类的一部分来实现的,来自Microsoft.SharePoint.Workflows命名空间.SPWinOePersistenceService类在WorkflowPersistenceService类中实现了SaveWorkflowInstanceStateLoadWorkflowInstanceStateSPWinOeHostServices 类的SaveInstanceDataLoadInstanceData 方法将要依次被SPWorkflowManager 的一些签名方法调用。

数据存储在哪里呢?数据被压缩成二进制文件然后存储在Sharepoint的内容数据库内,列名是InstanceData ,表示当前工作流实例的状态

posted @ 2007-12-03 00:13 Bruce Lee 阅读(329) | 评论 (0)编辑

2007年11月30日

问题

现在先跟你说一下客户的当前背景,客户那里的MOSS系统,用的帐号基本上是只有只读权限的,所以审批不了公文,这是正常现象.

但他们要求用户审批得了公文,所以我就得对工作流的任务下手了,进行处理:

在工作流开发里面,用CreateTask活动来创建任务,CreateTask活动有一个HybridDictionary类型的属性叫做SpecialPermissions,来解决权限问题.也就是说将这个任务指定给这个人,那就只有这个人看得到任务,并批得了任务,就算是只读用户也可以(我自己用只读+限制访问的用户权限进行测试过,可以).

本上说,上面的方法可以解决我的难题了,但在后面的应用中,我就出现问题了,我说一下问题的大概情况:

在一个流程中,用CreateTask活动来创建任务,不被包函在whileActivate里面,可以通过SpecialPermissions指定权限,实现我要的效果.

但你知道,我们设计的工作流是顺序流,是通过while循环的方式,实现流程任务跳转及回退的,也就是说,任务是需要被包函在whileActivate里面的,但这个时候,我就发现了问题, CreateTask里面的SpecialPermissions指定任务权限它不工作了,没有效果.但我使用的程序是一样的,区别就在于有没有在whileActivate里面.不知道是不是WF里的一个bug还是需要特点的方式实现 .

这是我遇到的主要问题.

即然上面的方式实现不了我的需求,我就试想着用别的方法来实现:自定义任务的权限,把任务当成一个item级来看待,分配权限,虽然里面我做到了任务权限分配,但又出现一个问题,那就是在工作流审批时,出现了任务锁定,无法审批工作流错误,在些,我再多问一个问题,工作流任务列表里的任务是不是不能被修改的呢?我发觉我一修改到任务列表的东西,都会出现任务锁定问题,对此问题,有什么解决的办法吗?

上面的这个问题导致了今天无法让用户测试流程的原因,因为权限的问题没有解决,使得流程不能发给用户,这个问题比较急,希望尽快得到处理或有其它办法.

测试结论

SpecialPermissions来给任务赋权限可以实现只让被赋权限人看到和编辑,而且在While中也不受影响。

工作流任务是个特殊的任务列表,不能通过对一般的列表赋权限给工作流任务列表的ITEM赋权限,否则会使工作流状态锁死,不知道能解决不。

明天在研究。。。。。。

posted @ 2007-11-30 01:06 Bruce Lee 阅读(329) | 评论 (0)编辑

2007年11月28日

问题1:

在使用Form验证的站点中,表单库中使用用户自定义的InfoPath表单,则无法以此InfoPath表单创建任何文档,以该表单模板创建的历史文档也无法在浏览器中查看,请问是什么原因?

详细描述:

1. 在SharePoint的管理中心 “创建Web 应用程序”,端口为6633,使用windows验证,

2. 扩展该Web应用程序,端口使用3366,使用Form验证

3. 使用6633的应用程序创建网站集http://fgi:6633,这样在http://fgi:6633可以使用windows账号登陆,而在http://fgi:3366可以使用外部应用系统账号登陆。

4. 将InfoPath表单(完全信任)发布到网站集的表单库:

http://fgi:6633/QualifyApprove/Forms/AllItems.aspx,可以在浏览器中正常浏览,创建文档。

5. 而在使用Form验证的网站:

http://fgi:3366/QualifyApprove/Forms/AllItems.aspx,无法以此表单模板在浏览器中创建文档,或浏览http://fgi:6633/QualifyApprove/Forms/AllItems.aspx中创建好的历史文档。

请问如何在Form验证的站点中以浏览器的方式查看InfoPath表单模板创建的文档。

 

问题2:

Web Service使用下列代码

using (SPSite site = new SPSite(siteName + "/"))

{

using (SPWeb web = site.OpenWeb(webName))

{

site.AllowUnsafeUpdates = true;

web.AllowUnsafeUpdates = true;

SPFolder folder = web.GetFolder(formLibraryName);

// 查找是否有同名文件

foreach (SPFile file in folder.Files)

{

if (file.Name.Replace(".xml", "") == docName)

throw new Exception("File name exists.");

}

// 保存到表单库

folder.Files.Add(docName + ".xml", UnicodeEncoding.UTF8.GetBytes(formXml));

}

}

将xml文档保存到表单库时,有时会出现这样的错误:

System.Threading.ThreadAbortException: 正在中止线程。

在 System.Threading.Thread.AbortInternal()

在 System.Threading.Thread.Abort(Object stateInfo)

在 System.Web.HttpResponse.End()

在 Microsoft.SharePoint.Utilities.SPUtilityInternal.SendResponse(HttpResponse response, Int32 code, String strBody)

在 Microsoft.SharePoint.Utilities.SPUtilityInternal.Send401(HttpResponse response)

在 Microsoft.SharePoint.Utilities.SPUtility.HandleAccessDenied(Exception ex)

在 Microsoft.SharePoint.SPGlobal.HandleUnauthorizedAccessException(UnauthorizedAccessException ex)

在 Microsoft.SharePoint.Library.SPRequest.GetFileAndFolderProperties(String bstrUrl, String bstrStartUrl, ListDocsFlags ListDocsFlags, Boolean bThrowException, Int32& phrStatus, Object& pvarFiles, Object& pvarDirs, UInt32& pdwNumberOfFiles, UInt32& pdwNumberOfDirs)

在 Microsoft.SharePoint.SPWeb.GetFileAndFolderProperties(String strStartUrl, Object[,]& files, Object[,]& folders, UInt32& dwNumberOfFiles, UInt32& dwNumberOfFolders)

在 Microsoft.SharePoint.SPFolder.EnsureFileFolderData()

在 Microsoft.SharePoint.SPFileCollection.Undirty()

在 Microsoft.SharePoint.SPBaseCollection.System.Collections.IEnumerable.GetEnumerator()

而重新运行以上代码后,错误消失,文档正确保存,请问可能是什么问题。

 

问题3:

MOSS创建的站点需要集成USB Key认证,用户使用Key作为唯一的身份标识,需要自定义用户登录过程,不仅仅是用户,密码对的验证提供程序,而是自定义整个登录操作,因为需要做用户登录状态判断,用户登录信息存放,读取,设置过期,USB Key和Form认证的用户绑定等等。如果不使用MOSS的登录按钮:

<asp:button id=login commandname="Login" text="<%$Resources:wss,login_pagetitle%>" runat=server />

如何在自定义的用户登录页实现自定义的登陆过程?

 

问题4:

将多份InfoPath表单上传到MOSS的表单库,如果这些表单都引用了某个第三方的DLL如(FJXXXXXX..dll),则在上载表单模板后,系统提示:表单模板

QualityProposalService.xsn(urn:schemas-microsoft-com:office:infopath:QualityProposalService:-myXSD-2007-09-27T05-57-17)的程序集 FJXXXXXX..dll 与表单模板 QualityProposalContract.xsn(urn:schemas-microsoft-com:office:infopath:QualityProposalContract:-myXSD-2007-10-15T01-12-28)中的同名程序集冲突。

如何解决多个表单模板中引用同一DLL冲突的问题。

 

问题5:

工作流引擎通知外部的应用,需要将服务的实例注册到ExternalDataExchangeService上,如:

ExternalDataExchangeService.AddService(ExternalDataExchangeService myServiceA)

ExternalDataExchangeService.AddService(ExternalDataExchangeService myServiceB)

如果这里的myServiceA,myServiceB实现了同一个接口IMyInterface,这个接口,工作流模板使用IMyInterface作为通知CallExternalMethod活动通知外部应用的约定,那么,能否在工作流模板中指定使用某个ExternalDataExchangeService 服务实例,即:虽然myServiceA,myServiceB都已经注册到引擎,我希望CallExternalMethod活动能够调用myServiceB实例(默认情况下,myServiceA先被添加,则引擎只调用myServiceA的方法。)。

谢谢。

 

答复

问题1我需要时间配置环境,而且我还没配置过两个应用程序,用同样的内容数据库,老大有时间配给我看看。

 

问题3我就更没环境了,要USB棒,如果能给我弄来,我配配玩玩。自定义登录,你可以让他在登录按钮跳到一个自定义的页面,这个页面部署到layout里,写自己的代码,取USB信息,然后还是要实现MOSS的登录过程吧。

 

问题5,我就没能在一个ExternalDataExchangeService里面注册两个实现同样接口的服务,ExternalDataExchangeService里的接口服务是为了WF和外部程序通讯,接受外部事件而定义的模型,是和.NET的事件模型不太一样,为了解决ExternalDataExchangeService要区分普通service和定义的本地服务,WF和WPF中有关联属性,来解决区分服务的问题,你定义的这个接口类必须加上ExternalDataExchange属性,当你注册你定义的服务到ExternalDataExchangeService中时,运行时将根据ExternalDataExchange标签来找到相应服务接口,这些代理类能捕获事件并将他们发送到相应的工作流实列中,如果能找到会为其生成事件监听代理类,这个过程是由InterceptService()实现的,你可以看看IL里InterceptService的代码。大概原理就是这样,不知道讲清楚没,所以得到下面结论

1.当你注册你的DataExchange服务实现,System.Workflow.Activities.ExternalDataExchangeService类使用InterceptService()方法校验[ExternalDataExchange]接口是不是紧紧被一个服务实现.

2.一个意思就是,当你使用CallExternalMethod活动,你仅仅能指定一个你想使用的[ExternalDataExchange]接口(他的实现被作为服务注册),在VS的界面里也只允许你选择一个接口,这个服务就等待WF运行时调用,所以如果你有几个服务实现了相同的接口,就会出现问题。

但你可以在一个接口里定义几个事件,不同的HandleExternalEventActivity响应不同的宿主事件

 

问题2,确实是这样的,在自己开发的Webservice调用Sharepoint的对象模型时,会有第一次运行,报这个错误,如果你的Webservice部署在其他机器上,甚至Webservice都不能访问MOSS的OM,这是由于权限问题。单单加site.AllowUnsafeUpdates = true; web.AllowUnsafeUpdates = true;是不够的。

原因就是你的Webservice的应用程序池的运行账号和Sharepoint的权限的问题,具体原因我就不讲那么清楚了,是网络认证的问题,你可以在你的Webservic的代理类下加下面的代码

NetworkCredential networkCredential = new NetworkCredential("Sharepoint的运行账号", "密码", "域名");

this.Credentials = networkCredential;

应该可以解决问题

上面的工程截图是我用Webservice调用MOSS的OM的方法,写好Webservice,然后自己写调用的代理类。在代理类构造函数里加上我上面的两行代码。

这个问题是对Webservice和Web应用程序的认证调用原理不太清楚,以至于他们不懂为什么。

因为需要在代码或配置文件中写上MOSS的服务账号,有安全问题,所以不是最好的解决方法。

还有更好的解决方法。

先顶着吧大老。

 

问题4验证后,不存在此问题。不知道是不是我理解错误,如果是这样的场景,那应该是正常的,至少发布到表单库不会出现错误提示,请老大告诉这些客户,一定要把场景描述清楚,否则很难判断错误,做一个测试要很长时间的,太浪费时间了。

1. 我做了两个infopath表单,ShareDLLTestOne.xsn和ShareDLLTestTwo.xsn,都有后台代码,而且引用了一个我的DLL,这个DLL就是一个属性,在infopath的Onload事件给这个外部DLL的属性赋值,然后把这个属性的值再给我的表单,调试中一切正常,包括外部DLL的属性赋值,和表单Onload时引用该属性值。

2. 然后把两个表单上传到表单库,管理员审批,并激活到网站。没有他所描述的什么冲突问题,然后在表单库里填写表单正常。看下面截图。

到此一切正常。

posted @ 2007-11-28 01:28 Bruce Lee 阅读(417) | 评论 (2)编辑

2007年11月25日

各位很抱歉,由于微软要求我们不能把PPT和Word文档的原文件给大家,要求转为PDF,Mind图里是我讲课的笔记,所以也转为PDF了。

/Files/BruceLee521/1.part1.rar
/Files/BruceLee521/1.part2.rar
/Files/BruceLee521/1.part3.rar
posted @ 2007-11-25 16:16 Bruce Lee 阅读(194) | 评论 (2)编辑

2007年10月21日

/Files/BruceLee521/BruceLeeApproveDocument.rar

部署命令

stsadm -o addsolution -filename BruceLeeApproveDocument.wsp

stsadm -o deploysolution -name BruceLeeApproveDocument.wsp -url http://localhost:8080 -immediate -allowGacDeployment -force

posted @ 2007-10-21 17:58 Bruce Lee 阅读(261) | 评论 (4)编辑

2007年10月15日

只是个验证,还有待完善,先发个图,太晚了,有时间再把Demo发上来。
程序运行输出日志
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.InitWorkflow 工作流初始化成功
CodeActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.ExecuteCodeOne ParallelActivity第一个子Activity内的代码执行
CodeActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.ExecuteCodeTwo ParallelActivity第二个子Activity内的代码执行
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.createTaskOne_MethodInvoking 李1任务创建成功
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.createTaskTwo_MethodInvoking 李2任务创建成功
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedOne_Invoked 李1审批意见:确定
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedOne_Invoked 李1任务完成
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.completeTaskOne_MethodInvoking 李1任务完成
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedTwo_Invoked 李2审批意见:OK
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedTwo_Invoked 李2任务完成
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.completeTaskTwo_MethodInvoking 李2任务完成
ReplicatorActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.replicatorActivityOne_Initialized 复制两个子Activity成功
ReplicatorActivity.ExecuteTemplate => Activity.RaiseGenericEvent => SequentialWorkflow.replicatorActivityOne_ChildInitialized 初始化 第一个子Activity 成功
ReplicatorActivity.ExecuteTemplate => Activity.RaiseGenericEvent => SequentialWorkflow.replicatorActivityOne_ChildInitialized 初始化 第二个子Activity 成功
CodeActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.ExecuteCodeThree ParallelActivity Activity内的代码执行
CodeActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.ExecuteCodeThree ParallelActivity Activity内的代码执行
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.createTaskThree_MethodInvoking 李3任务创建成功
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.createTaskThree_MethodInvoking 李3任务创建成功
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedThree_Invoked 李3审批意见:可以
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedThree_Invoked 李3任务完成
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.completeTaskThree_MethodInvoking 李3任务完成
ReplicatorActivity.HandleStatusChange => Activity.RaiseGenericEvent => SequentialWorkflow.replicatorActivityOne_ChildCompleted 完成 第一个子Activity
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedThree_Invoked 李3审批意见:Good
HandleExternalEventActivity.RaiseEvent => Activity.RaiseGenericEvent => SequentialWorkflow.onTaskChangedThree_Invoked 李3任务完成
CallExternalMethodActivity.Execute => Activity.RaiseEvent => SequentialWorkflow.completeTaskThree_MethodInvoking 李3任务完成
ReplicatorActivity.HandleStatusChange => Activity.RaiseGenericEvent => SequentialWorkflow.replicatorActivityOne_ChildCompleted 完成 第二个子Activity
ReplicatorActivity.HandleStatusChange => Activity.RaiseEvent => SequentialWorkflow.replicatorActivityOne_Completed RreplicatorActivity完成








  代码在下面

/Files/BruceLee521/BruceLeeSharePoint2007Sample.rar

posted @ 2007-10-15 23:48 Bruce Lee 阅读(296) | 评论 (2)编辑