调用 FileHold 时出错 API DocumentFinder.LoadSmartFolder、"The request failed with HTTP status 401: Unauthorized."

Error calling FileHold API DocumentFinder.LoadSmartFolder, "The request failed with HTTP status 401: Unauthorized."

我正在尝试使用 Powershell 的点网 API 在 FileHold 中进行搜索。脚本可以正常登录,但随后出现此错误,提示我未获得授权。

Exception calling "LoadSmartFolder" with "1" argument(s): "The request failed with HTTP status 401: Unauthorized."
At line:8 char:57
+ $searchCriteria = $lmDocumentFinderProxy.LoadSmartFolder <<<< ( $savedSearchId )
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

下面是一些演示该问题的示例代码。

$userId = "sysadm"
$password = "12345"
$clientType = "CustomClient"
$savedSearchId =  6

$urmSessionManagerProxy = New-WebServiceProxy -Uri http://fileholdtest4/fh/filehold/UserRoleManager/SessionManager.asmx?WSDL
$sessionId = $urmSessionManagerProxy.StartSession( $userId, $password, $clientType )

$lmDocumentFinderProxy = New-WebServiceProxy -Uri http://fileholdtest4/fh/filehold/LibraryManager/DocumentFinder.asmx?WSDL                
$searchCriteria = $lmDocumentFinderProxy.LoadSmartFolder( $savedSearchId )
$prevGuid = [guid]::empty
$guid = [guid]::empty
$columns = $lmDocumentFinderProxy.GetDocumentsBySnapshot( $prevGuid, [ref]$guid, "SRT", $searchCriteria, $null, 0, 20 )

问题是没有使用有效会话 ID 传递给 DocumentFinder 服务的 cookie。 SessionManager 服务的 StartSession 方法是少数不需要由 cookie 标识的有效会话的 FileHold 服务之一。这就是它在没有 cookie 的情况下工作的原因。

成功的 StartSession 调用会提供会话 ID。您需要创建一个 cookie 容器并添加一个 FHLSID cookie 并将其附加到 DocumentFinder 代理。

以下代码说明了示例的必要更改。

$userId = "sysadm"
$password = "12345"
$clientType = "CustomClient"
$savedSearchId =  6

$urmSessionManagerProxy = New-WebServiceProxy -Uri http://fileholdtest4/fh/filehold/UserRoleManager/SessionManager.asmx?WSDL
$sessionId = $urmSessionManagerProxy.StartSession( $userId, $password, $clientType )

$lmDocumentFinderProxy = New-WebServiceProxy -Uri http://fileholdtest4/fh/filehold/LibraryManager/DocumentFinder.asmx?WSDL                

$uri = [System.Uri]$lmDocumentFinderProxy.Url
$cookie = New-Object System.Net.Cookie( "FHLSID", $sessionId, "/", $uri.Host ) 
$lmDocumentFinderProxy.CookieContainer = New-Object System.Net.CookieContainer
$lmDocumentFinderProxy.CookieContainer.Add( $cookie )                

$searchCriteria = $lmDocumentFinderProxy.LoadSmartFolder( $savedSearchId )
$prevGuid = [guid]::empty
$guid = [guid]::empty
$columns = $lmDocumentFinderProxy.GetDocumentsBySnapshot( $prevGuid, [ref]$guid, "SRT", $searchCriteria, $null, 0, 20 )