gpt4 book ai didi

c# - 使用 Powershell 调用 WCF 服务方法

转载 作者:太空狗 更新时间:2023-10-29 23:37:50 25 4
gpt4 key购买 nike

我有一个 WCF 服务,它使用 wsHttpBinding 与消息安全和 clientcredentialtype 作为 windows,并且该服务有一个简单的方法

[OperationContract]
string SayHello();

public string SayHello()
{
return "HELLO";
}

<wsHttpBinding>
<binding name="WSHttpBinding">
<security mode="Message">
<message clientCredentialType="Windows" />
</security>
</binding>
</wsHttpBinding>

我正在尝试在 powershell(版本 >= 2)上执行以下操作,但出现以下错误

$wshttpbinding= New-WebServiceProxy -uri http://localhost:52871/Service.svc -Credential DOMAIN\gop

PS> $wshttpbinding.SayHello.Invoke()
Exception calling "SayHello" with "0" argument(s): "The operation has timed out"
At line:1 char:1
+ $wshttpbinding.SayHello.Invoke()
+ ~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException

但是,当我将绑定(bind)更改为使用 basicHttpBinding 时,它工作正常

<basicHttpBinding>
<binding name="basicconfig"
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" />
</security>
</binding>
</basicHttpBinding>

$basichttpbinding= New-WebServiceProxy -uri http://localhost:52871/Service.svc -Credential DOMAIN\gop

PS> $basichttpbinding.SayHello.Invoke()
HELLO

使用 wsHttpBinding 时,我需要在我的脚本中做些什么不同的事情吗?

提前致谢。

final方法我仅将 wsHttpBinding 用于 WCF 事务支持。但是我很快意识到,powershell 脚本需要调用的服务方法调用与事务无关。因此,我使用 Windows 身份验证公开了另一个 BasicHttpBinding 端点,它与以下脚本一起工作。请参阅下面的代码段

Try
{
$cred = new-object -typename System.Management.Automation.PSCredential ` -argumentlist $username, $password -ErrorAction Stop
}
Catch {
LogWrite "Could not create PS Credential"
$credErrorMessage = $_.Exception.Message
LogWrite $credErrorMessage
Break
}

Try{
$service=New-WebServiceProxy –Uri $url -Credential $cred -ErrorAction Stop
} Catch {
LogWrite "Could not create WebServiceProxy with $url"
$proxyErrorMessage = $_.Exception.Message
LogWrite $proxyErrorMessage
Break
}

# Create Request Object
$namespace = $service.getType().namespace
$req = New-Object ($namespace + ".UpdateJobRequest")

LogWrite "Calling service..."
$response = $service.UpdateJob($req)

最佳答案

我创建了一个 PowerShell 模块 WcfPS这也可以在 gallery 中找到这有助于您使用元数据交换为目标服务创建内存代理。我已经使用此模块访问具有联合安全性的服务,这在配置中非常繁重且困难,因此我相信它也适用于您。还有一个blog post .所有模块都允许您使用 soap 端点,而无需维护通常在 .net 项目中找到的服务模型配置文件和服务引用。

这是一个示例,其中 $svcEndpoint 保存目标端点的值

  1. 探测元数据交换端点
  2. 为代理创建内存类型
  3. 根据导入的配置创建端点
  4. 创建 channel (代理实例)

这是从github页面复制的示例代码

$wsImporter=New-WcfWsdlImporter -Endpoint $svcEndpoint -HttpGet
$proxyType=$wsImporter | New-WcfProxyType
$endpoint=$wsImporter | New-WcfServiceEndpoint -Endpoint $svcEndpoint
$channel=New-WcfChannel -Endpoint $endpoint -ProxyType $proxyType

该模块并不完美,所以如果有什么遗漏,请随时贡献。

我很抱歉可能被认为是不完整的答案,但这不适合发表评论。

关于c# - 使用 Powershell 调用 WCF 服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33005715/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com