嗨,我在设置SessionHeaderValue时遇到麻烦。我将我的代码基于C#.Net。登录正常,我在登录结果中收到serviceUrl和sessionId,但无法在 session 标题中获得设置的 session ID

这是代码

$uri = "c:\installs\sforce.wsdl"
$username = "username"
$password = "password"
# Proxy
$service = New-WebServiceProxy -Uri $uri -Namespace sforce -UseDefaultCredential
# Login
$loginResult = $service.login($username, $password)
$service.Url = $loginResult.serverUrl
$service.SessionHeaderValue = New-Object sforce.SessionHeader

这是我得到的错误,有点奇怪。

异常设置“SessionHeaderValue”:“无法将类型为“sforce.SessionHeader”的“sforce.SessionHeader”值转换为类型“sforce.SessionHeader”。

我已经玩了几个小时了,但想法不多了。

任何帮助表示赞赏。

安东尼

最佳答案

真正的问题是您不能重用$service。您的$service实例仅适合登录,仅此而已。我认为这是由于New-WebServiceProxy的工作方式所致。检查这个小脚本:

$uri = 'file://C:\projects\CRM\SalesForce\Integration\enterprise.xml'
$api = new-webserviceproxy -uri $uri -NameSpace SalesForce

$api.GetType().Module.Assembly.ManifestModule.ScopeName

$api = new-object SalesForce.SforceService.ScopeName
$api.GetType().Module.Assembly.ManifestModule

如果要运行此脚本(当然,您需要替换自己的WSDL),则会看到类似以下内容(DLL是动态的,因此名称将有所不同):
mhgl0l5w.dll
vzecopaq.dll

请注意,不仅$ api的对象引用有所不同,而且New-WebServiceProxy创建的动态程序集对于每个对象都不同,这不是您所期望的。这就是为什么你的 Actor 失败了。您具有相同名称的对象是不同的,因为它们来自不同的动态程序集。我不确定这种行为为什么会发生-如果是New-WebServiceProxy的特殊性,或者是SalesForce的WSDL中的某种原因。

解决方案实际上非常简单。从New-WebServiceProxy生成的 namespace 中重新创建服务对象,如下所示:
$uri = "c:\installs\sforce.wsdl"
$username = "username"
$password = "password"
# Proxy
$service = New-WebServiceProxy -Uri $uri -Namespace sforce -UseDefaultCredential

# Login
$loginResult = $service.login($username, $password)

$service = New-Object sforce.SforceService
$service.Url = $loginResult.serverUrl
$service.SessionHeaderValue = New-Object sforce.SessionHeader

07-26 05:39