调用FileHold API DocumentFinder.LoadSmartFolder时出错,"请求失败,HTTP状态为401:未经授权。"

时间:2015-10-08 21:48:34

标签: web-services powershell session-cookies

我正在尝试使用Powershell的dot net 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 )

1 个答案:

答案 0 :(得分:1)

问题是没有cookie传递给具有有效会话ID的DocumentFinder服务。 StartSession服务的SessionManager方法是少数几个不需要cookie标识的有效会话的FileHold服务之一。这就是它没有cookie的原因。

会话ID提供了成功的StartSession电话。您需要创建一个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 )