- 解决方案发布最好发布到GAC中,使用WebApplication很多时候会有问题。TimerJob并非是在IIS下运行,所以发布到wss目录下的dll不能使用。
- 如果解决方案中只有一个Timer Job的Feature,会导致只能全局部署,无法只部署在某个web application中。笨解决办法是添加一个可视web part的Feature,完全不用它即可。
- Timer Job不可以发布在web级别,至少应该是Site级别的。推荐Site级别,这样在该站点下就可以看到了。另:如是Web Application级别的,则需要在"应用程序管理"---"管理Web应用程序"---选中---"管理功能"中管理。
- 使用Site级别的Feature创建Timer Job时候可能会提示权限不足。解决办法是需要开启远程管理员权限。方法见底部,注意IISreset。
- 发布时注意是否有引用的资源,如需要引用资源需一并发布。
- 因环境问题,很多时候发布后都需要去管理中心的管理解决方案中部署。再去相应位置启用Feature。
- 如发布后显示成功,但是代码依旧是旧的代码,则需要清空缓存。方法见http://www.cnblogs.com/ceci/p/6014684.html.
- Timerjob较为彻底的排查问题是需要 GAC检查、缓存清理、TimerJob服务重启、IISReset等方式。依旧不行的话,直接在站点中放个Log List来记录Log吧。
- 遭遇过管理中心看不到Timer Job,但是实际已经部署成功的情况。在附加IIS进程,debug到创建Timer Job的步骤后就正常出现了。原因不明。
开启远程服务器管理员权限
参见: https://support.microsoft.com/zh-cn/help/2564009/access-denied-when-deploying-a-timer-job-or-activating-a-feature-from-sharepoint-2010-content-web-application
//Console app code
SPWebService myService = SPWebService.ContentService;
myService.RemoteAdministratorAccessDenied = false;
myService.Update();
//PowerShell code
function Set-RemoteAdministratorAccessDenied-False()
{
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint") > $null
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SharePoint.Administration") > $null
# get content web service
$contentService = [Microsoft.SharePoint.Administration.SPWebService]::ContentService
# turn off remote administration security
$contentService.RemoteAdministratorAccessDenied = $false
$contentService.Update()
}
Set-RemoteAdministratorAccessDenied-False
注意IISReset。
另外方法:
protected override bool HasAdditionalUpdateAccess() { return true; }
https://sharepoint.stackexchange.com/questions/49222/access-denied-while-activating-custom-timer-job