На момент написания этой статьи мне все еще не удавалось успешно использовать командлет New-WebServiceProxy
с службой WCF с включенным MTOM; это не похоже, что командлет поддерживает это. Мой обходной путь включал запуск svcutil.exe
для wsdl, а затем компиляцию класса в dll с использованием csc.exe
. Затем я загрузил сгенерированную сборку во время выполнения powershell, а затем вручную настроил конечную точку и привязку прокси-класса:
Создание файла .cs из вашего wsdl:
$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.exe
и csc.exe
могут отсутствовать в PATH вашего PowerShell. Вы можете добавить его в свой путь или использовать полный путь. Svcutil
можно найти в вашем Microsoft SDKs\Windows\<version>\bin
. csc.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 Framework\v3.0\Windows 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)