Powershell:使用MTOM消息编码消耗WCF服务时出错

我目前正在探索PowerShell的功能,但我遇到了一个我一直无法解决的问题。 任何快速提示将不胜感激=)

我的目标:从PowerShell v2.0中的WCF服务(使用MTOM消息编码配置)调用方法(希望使用new-webserviceproxy cmdlet)

我的问题:当消息编码设置为Mtom时,new-webserviceproxy cmdlet无法正确解析服务的响应。 我收到以下错误:

PowerShell

$proxyObject = New-WebServiceProxy -URI "http://myserver.com/AccessService.svc?wsdl"
$proxyObject.TestWebServiceConnection()

使用“0”参数调用“TestWebServiceConnection”的异常:“客户端找到响应内容类型'multipart / related; type =”application / xop + xml“; start =”&lthttp://tempuri.org/0>“ ;边界=“UUID:
4001d529-32b9-4560-9f4b-550c35c67b03 + id = 4“; start-info =”text / xml“',但期望'text / xml'。
该请求失败,并显示错误消息:
-
--uuid:4001d529-32b9-4560-9f4b-550c35c67b03 + ID = 4
Content-ID:< http://tempuri.org/0>
内容传输编码:8位
Content-Type:application / xop + xml; charset = utf-8; type =“text / xml”
&lts:Envelope xmlns:s =“http://schemas.xmlsoap.org/soap/envelope/”>
&LTS:身体>
&ltTestWebServiceConnectionResponse xmlns =“http://myserver.com/”>
&ltTestWebServiceConnectionResult&gtsuccess </ TestWebServiceConnectionResult>
</ TestWebServiceConnectionResponse>
</ S:身体>
</秒:信封>
--uuid:4001d529-32b9-4560-9f4b-550c35c67b03 + ID = 4--
- “。
在线:1个字符:38
+ $ proxyObject.TestWebServiceConnection <<<<()>> error.txt
+ CategoryInfo:NotSpecified:(:) [],MethodInvocationException
+ FullyQualifiedErrorId:DotNetMethodException

注意我能够通过其他客户端甚至Microsoft提供的wcfclient工具来使用WCF服务。 您可以看到TestWebServiceConnectionResult返回成功,但似乎代理对象无法解析响应。

行为

&ltserviceBehaviors>
&ltbehavior name =“MyServiceBehavior”>
&ltserviceThrottling maxConcurrentCalls =“100”maxConcurrentSessions =“100”/>
&ltserviceMetadata httpGetEnabled =“true”httpsGetEnabled =“false”/>
&ltserviceDebug includeExceptionDetailInFaults =“false”/>
</行为>
</ serviceBehaviors>

绑定 (我排除了超时值/阅读器配额和邮件大小,因为它们的值排列似乎与我的问题无关):


&ltbasicHttpBinding>
&ltbinding name =“basicHttpEndpointBinding”messageEncoding =“Mtom”>
&ltsecurity mode =“None”>
&lttransport clientCredentialType =“None”/>
</安全>
</ basicHttpBinding的>

服务

&ltservice behaviorConfiguration =“MyServiceBehavior”name =“MyService.AccessService”>
&ltendpoint address =“”binding =“basicHttpBinding”bindingConfiguration =“basicHttpEndpointBinding”name =“basicHttpEndpointAccessService”bindingNamespace =“http://myserver.com/”contract =“MyService.IAccessService”/>
&ltendpoint address =“mex”binding =“basicHttpBinding”bindingConfiguration =“basicHttpEndpointBinding”name =“mexEndpointAccess”contract =“IMetadataExchange”/>
</服务>

截至撰写本文之时,我仍然无法成功地将New-WebServiceProxy cmdlet与启用了MTOM的WCF服务结合使用; 它看起来不像该cmdlet支持它。 我的解决方法包括针对wsdl运行svcutil.exe ,然后使用csc.exe将该类编译为dll。 然后我将生成的程序集加载到powershell运行时,然后手动配置代理类的端点和绑定:

从您的wsdl生成.cs文件:

$svcUri = "http://yourdomain/yourService.svc?wsdl";
$csFile = $className + '.cs';   # The name of the generated .cs file
$dllName = [System.IO.Path]::Combine($temp, $className + ".dll")
$svcUtilresult = svcutil.exe /noConfig /out:$csFile $svcUri

注意svcutil.execsc.exe可能不在您的PowerShell的PATH中。 您可以将其添加到PATH或使用完整路径。 Svcutil可以在您的Microsoft SDKsWindows<version>bincsc.exe位于您的%windir%Microsoft .Net文件夹中

一旦你生成了.cs文件,你需要将它编译成一个dll文件:

&"csc.exe" /t:library /out:$dllName $csFile

将编译后的dll加载到powershell中:

$fileStream = ([System.IO.FileInfo] (Get-Item ".$dllName")).OpenRead()
$dllBytes = new-object byte[] $fileStream.Length
$fileStream.Read($dllBytes, 0, $fileStream.Length)
$fileStream.Close()

[System.Reflection.Assembly]::Load($dllBytes)

在powershell中实例化代理客户端:

# Load System.ServiceModel, which can be found in your Frameworkv3.0Windows Communication Foundation folder
[System.Reflection.Assembly]::LoadFile($pathToSystemServiceModel)

# className is the name of your service
$serviceClientName = $className + "Client"

$basicHttpBinding = New-Object System.ServiceModel.BasicHttpBinding
$basicHttpBinding.MessageEncoding = [System.ServiceModel.WSMessageEncoding]::Mtom

$endPoint = New-Object System.ServiceModel.EndpointAddress($svcUri)
$wsClient = New-Object $serviceClientname($basicHttpBinding, $endPoint)

我遇到了类似的问题。 不过,我碰巧已经将ClientBase生成的代码编译为本地程序集。

我的解决方案是:

add-type -path "....binMYassemblyWithWCFCLient.dll"
$binding = new-object system.servicemodel.basichttpbinding
$binding.MessageEncoding = "Mtom"
$endpoint = new-object System.ServiceModel.EndpointAddress("http://whodunit.oops/mtomandjerry.svc")
$regProxy = new-object MySpecialNamespace.OopsServiceContractClient($binding, $endpoint)
链接地址: http://www.djcxy.com/p/34295.html

上一篇: Powershell: Error consuming WCF services with MTOM message encoding

下一篇: Why does the XmlRoot attribute gets ignored in WCF and how to overcome this