PoshCode Logo PowerShell Code Repository

PS2WCF by cglessner 3 years ago (modification of post by cglessner view diff)
diff | embed code: <script type="text/javascript" src="http://PoshCode.org/embed/747"></script>download | new post

Call WCF Services with PowerShell using any binding. Generates proxy on the fly without needing any tool expect .NET 3.5. You can also discover the service endpoints, bindings and contracts. Read more on my blog: http://www.iLoveSharePoint.com

  1. # Call WCF Services With PowerShell V1.0 22.12.2008
  2. #
  3. # by Christian Glessner
  4. # Blog: http://www.iLoveSharePoint.com
  5. # Twitter: http://twitter.com/cglessner
  6. # Codeplex: http://codeplex.com/iLoveSharePoint
  7. #
  8. # requires .NET 3.5
  9.  
  10. # load WCF assemblies
  11. [void][System.Reflection.Assembly]::LoadWithPartialName("System.ServiceModel")
  12. [void][System.Reflection.Assembly]::LoadWithPartialName("System.Runtime.Serialization")
  13.  
  14. # get metadata of a service
  15. function global:Get-WsdlImporter($wsdlUrl=$(throw "parameter -wsdlUrl is missing"), $httpGet)
  16. {
  17.         if($httpGet -eq $true)
  18.         {
  19.                 $local:mode = [System.ServiceModel.Description.MetadataExchangeClientMode]::HttpGet
  20.         }
  21.         else
  22.         {
  23.                 $local:mode = [System.ServiceModel.Description.MetadataExchangeClientMode]::MetadataExchange
  24.         }
  25.        
  26.         $mexClient = New-Object System.ServiceModel.Description.MetadataExchangeClient((New-Object System.Uri($wsdlUrl)),$mode)
  27.         $mexClient.MaximumResolvedReferences = [System.Int32]::MaxValue
  28.         $metadataSet = $mexClient.GetMetadata()
  29.         $wsdlImporter = New-Object System.ServiceModel.Description.WsdlImporter($metadataSet)
  30.        
  31.         return $wsdlImporter   
  32. }
  33.  
  34. # Generate wcf proxy types
  35. function global:Get-WcfProxy($wsdlImporter=$null, $wsdlUrl, $proxyPath)
  36. {
  37.         if($wsdlImporter -eq $null -and $wsdlUrl -eq $null)
  38.         {
  39.                 throw "parameter -wsdlImporter or -wsdlUrl must be specified"
  40.         }
  41.         else
  42.         {
  43.                 if($wsdlImporter -eq $null)
  44.                 {
  45.                         $wsdlImporter = Get-WsdlImporter -wsdlUrl $wsdlUrl
  46.                         trap [Exception]
  47.                         {
  48.                                 $script:wsdlImporter = Get-WsdlImporter -wsdlUrl $wsdlUrl -httpGet $true
  49.                                 continue
  50.                         }
  51.                 }
  52.         }
  53.        
  54.         $generator = new-object System.ServiceModel.Description.ServiceContractGenerator
  55.        
  56.         foreach($contractDescription in $wsdlImporter.ImportAllContracts())
  57.         {
  58.                 [void]$generator.GenerateServiceContractType($contractDescription)
  59.         }
  60.        
  61.         $parameters = New-Object System.CodeDom.Compiler.CompilerParameters
  62.         if($proxyPath -eq $null)
  63.         {
  64.                 [void]$parameters.GenerateInMemory = $true
  65.         }
  66.         else
  67.         {
  68.                 $parameters.OutputAssembly = $proxyPath
  69.         }
  70.        
  71.         $providerOptions = new-object "System.Collections.Generic.Dictionary``2[System.String,System.String]"
  72.         [void]$providerOptions.Add("CompilerVersion","v3.5")
  73.        
  74.         $compiler = New-Object Microsoft.CSharp.CSharpCodeProvider($providerOptions)
  75.         $result = $compiler.CompileAssemblyFromDom($parameters, $generator.TargetCompileUnit);
  76.        
  77.         if($result.Errors.Count -gt 0)
  78.         {
  79.                 throw "Proxy generation failed"      
  80.         }
  81.        
  82.         foreach($type in $result.CompiledAssembly.GetTypes())
  83.         {
  84.                 if($type.BaseType.IsGenericType)
  85.                 {
  86.                         if($type.BaseType.GetGenericTypeDefinition().FullName -eq "System.ServiceModel.ClientBase``1" )
  87.                         {
  88.                                 $type
  89.                         }
  90.                 }
  91.         }
  92. }

Submit a correction or amendment below (
click here to make a fresh posting)
After submitting an amendment, you'll be able to view the differences between the old and new posts easily.

Syntax highlighting:


Remember me