请求安全令牌时,Word Automation Service BatchGetSyncJobStatus失败

时间:2016-05-12 16:21:59

标签: sharepoint-2013 word-automation-service

我正在运行SharePoint 2013内部部署服务器,我已在其上部署了一个简单的WCF服务作为服务器场解决方案。该服务接受包含单个MS Word文档作为有效负载的简单Http post请求,并返回转换为PDF的这些文件。 该服务可通过Http访问匿名用户。 WordAutomationService作为SharePoint服务器的管理用户帐户运行。

服务类创建Microsoft.Office.Word.Server.Conversions.SyncConverter的新实例,并将运行WordAutomationService的SharePoint代理传递给构造函数(以及一些ConversionJobSettings)。最后,它使用输入流(Word文档)和输出流(将包含由WordAutomationService生成的PDF文档的Web响应)调用SyncConverter上的Convert方法。

创建SyncConverter时,我没有设置UserToken属性,因为匿名用户对服务的访问权限。根据这里的评论https://msdn.microsoft.com/en-us/library/microsoft.office.word.server.conversions.syncconverter.usertoken.aspx,这似乎很好:

  

此属性的默认值是空引用(在Visual Basic中为Nothing),这是匿名的。

此设置适用于包含几页的小型Word文档,并返回预期的PDF文件。但是,只要SharePoint上的WordAutomationService的执行时间超过特定时间阈值(大约5秒),服务就会失败,因为它永远不会返回(这会导致客户端的读取超时)。 根据日志,似乎这样做的原因是,一段时间后,同步转换作业将工作转移到后台进程:

  

同步流作业转换需要太长时间。不要再等了。稍后检查其状态

然后通过调用ConversionServiceApplicationProxy.BatchGetSyncJobStatus定期轮询此作业的状态。不幸的是,这个调用失败了,因为它在内部尝试创建一个新的通道来与这个进程通信,并为此请求安全令牌。但是,SecurityTokenService无法完成令牌请求并抛出异常:

An unhandled exception has occurred. The security token request cannot be completed. System.InvalidOperationException: The security token request cannot be completed.    
at Microsoft.SharePoint.SPSecurityContext.SecurityTokenForServiceContext(Uri contextUri)     
at Microsoft.SharePoint.SPChannelFactoryOperations.InternalCreateChannelActingAsLoggedOnUser[TChannel](ChannelFactory`1 factory, EndpointAddress address, Uri via)     
at Microsoft.Office.ConversionServices.Service.ConfigChannelFactory`1.CreateChannel(EndpointAddress address)     
at Microsoft.Office.ConversionServices.Service.ConversionServiceApplicationProxy.GetChannel(Uri uri)     
at Microsoft.Office.ConversionServices.Service.ConversionServiceApplicationProxy.ExecuteOnChannel(Uri endpointAddress, Action`1 action)     
at Microsoft.Office.ConversionServices.Service.ConversionServiceApplicationProxy.BatchGetSyncJobStatus(ICollection`1 ucids, Uri endpointAddress)     
at Microsoft.Office.ConversionServices.Service.BatchGetStatusPollingThread.Run()     
at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)     
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)     
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)     
at System.Threading.ThreadHelper.ThreadStart() StackTrace:  
at onetnative.dll: (sig=37460b31-4453-4365-92f5-3a11c267be48|2|onetnative.pdb, offset=28F56) at onetnative.dll: (offset=15735)   

我现在不知道如何摆脱令牌问题,以便系统可以创建必要的渠道来轮询转换作业状态。任何帮助都非常感谢。谢谢!

(我无法发布完整日志,因为它注册为垃圾邮件)

2 个答案:

答案 0 :(得分:4)

我发现,如果您要在域控制器上安装SharePoint 2013(微软称这种拓扑只适用于开发但不适合生产),那么IIS(IUSR)中的默认匿名用户将无法运行可靠,并且通过配置为使用IUSR帐户的匿名访问的IIS站点访问的任何WCF解决方案在尝试访问安全令牌服务时都将失败。

在这种情况下,最方便的解决方案是重新配置IIS以使用另一个匿名身份,即绑定到应用程序池的身份。

例如,如果您的网站名为NameOfSite,则可以在提升的PowerShell中运行:

Set-WebConfigurationProperty `
  -Filter /system.WebServer/security/authentication/AnonymousAuthentication `
  -Name username `
  -Value "" `
  -location "NameOfSite"

这解决了当前的问题,即SecurityTokenForServiceContext失败。但是,如果您已在Windows 2012 R2上将SharePoint 2013安装为域控制器,那么它还没有结束:WordServerWorker实际上无法在此配置中启动。

但是,我还可以确认,如果您要在独立服务器上安装SharePoint 2013(在无人参与配置文件中具有<Setting Id="SERVERROLE" Value="SINGLESERVER"/>角色),那么整个解决方案将端到端地运行,并且WordServerWorker实际上会正常开始。

以前,有关此问题的最相关(且未答复)问题必须是此MSDN帖子“The security token request cannot be completed”。我认为在这种情况下,服务只处于元稳定状态,其中一个IIS工作人员之前会在本地测试期间通过NTLM获得凭证。

答案 1 :(得分:0)

通常,当sharepoint服务应用程序相互交互时,这些服务通过使用service application framework(SAF)来通过wcf调用维护当前用户上下文。它允许这些服务使用SPContext.Current,保留调用日志之间的相关ID等。当此上下文丢失时,服务停止能够相互通信。例如,如果我们有一个启动新线程但没有为新创建的线程上下文设置用户的代码,就会发生这种情况。

根据您的描述,您的服务是匿名的,并且没有使用SAF维护用户上下文,但使用了一些需要存在该上下文的服务

可能的解决方案是使用SAF(简而言之,这是一个棘手的配置WCF)而不是没有身份验证的普通WCF服务

修改

另一个可能的解决方案可能是使用RunWithElevatedPrivileges包装您的代码,以使您的服务将sharepoint与应用程序池标识连接