【问题标题】:How can I use System.Net.WebClient like PowerShell New-WebServiceProxy?如何像 PowerShell New-WebServiceProxy 一样使用 System.Net.WebClient?
【发布时间】:2017-11-07 17:48:54
【问题描述】:

与使用 C# 相比,我通过 PowerShell 连接到服务时遇到的问题是该服务需要在标头中传递一个密钥。

我可以将new-WebServiceProxy 与URI 一起使用,并让它传递默认凭据。这样我就可以拿到限时服务密钥了,但是后续调用服务,没有办法传递密钥,导致报错没有有效的服务密钥。

我知道 cmdlet 使用 System.Net.WebClient 类,并且它有一个我想尝试使用的可设置 headers 属性。我似乎无法让该类以与 cmdlet 相同的方式运行并返回一个对象。有人知道怎么做吗?

这是我正在使用的,但可以直接从 PowerShell 在 .Net 中实现:

$QMSService = New-WebServiceProxy -Uri http://localhost:4799/QMS/Service -Namespace QlikViewServer -UseDefaultCredential

这是我用来访问服务的 Powershell cmdlet。我想使用以下方法完成相同的操作:

$Client = New-Object System.Net.WebClient
$Client.UseDefaultCredentials = $true
$Client.BaseAddress = "http://localhost:4799/QMS/Service"

我只是不知道如何使用 System.Net.WebClient 创建一个代理对象,让我可以访问该服务提供的所有成员。设置好之后,我可以获取 TimeLimitedServiceKey 并执行以下操作:

$ServiceKey = $ProxyObjectCreatedFromClient.GetTimeLimitedServiceKey()
$Client.Headers = "X-Service-Key", $ServiceKey

如果有人可以帮助我了解如何创建代理对象。

【问题讨论】:

    标签: .net web-services powershell webclient new-webserviceproxy


    【解决方案1】:

    GetTimeLimitedServiceKey() 方法似乎来自 QMSClient API:https://help.qlik.com/en-US/qlikview-developer/12.1/apis/QMS%20API/html/2be1e405-a7e5-4a43-b1b6-9540b23a6226.htm

    ...意思是,您需要直接引用该第三方 API(New-Object、Add-Type、Add-Type w/p/invoke 等),然后调用 GetTimeLimitedServiceKey()

    $service = New-WebServiceProxy -Uri http://someHost:4799/QMS/Service -Namespace QlikViewServer -Credential (get-credential)
    $serviceKey = $service.GetTimeLimitedServiceKey()
    

    https://community.qlik.com/thread/143003

    【讨论】:

    • 这是一个 Web 服务,因此使用 new-webserviceproxy 创建代理对象只是保持与服务本身的开放连接,但会生成一个对象供我使用,让我可以访问所述服务的方法。我可以通过该对象获取密钥,但是该 cmdlet 不允许我将标头信息注入到对 uri 的 post 调用中。 .net 等效项可以,但我一生都无法弄清楚如何生成一个代理对象,让我可以访问 PS cmdlet 执行的方法。
    • $QMSService 不只是入口点吗?您是否尝试过 $QMSService |通用汽车?看看有哪些可用的属性/方法?
    • 我只是想弄清楚如何获取代理对象,就像 new-webserviceproxy 返回的一样,但使用 system.net.webclient。我尝试对从 system.net.webclient 返回的对象执行 gm,但我没有看到任何返回此类对象的方法。
    • 问题是 .NET 中唯一的“代理”命名对象是像 n 80/443 网站过滤代理这样的代理。在您所在的上下文中使用的代理(用于对远程 API 进行持久本地化调用的 Web 服务提供者)在该单个 cmdlet 之外的相同上下文中不存在。我找到的 qlik API 示例。请参阅编辑后的答案,例如在对 .NET webclient 的非持久调用上使用 hte cmdlet。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2021-02-11
    • 2017-04-20
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多