Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Execute a one-way wcf service operation from powershell

I have a scheduled task which executes a powershell script every hour. The powershell script must make a call to a one-way WCF service operation. Essentially it just needs to kick off an operation. My question is how do I go about doing that? I thought that just executing the url would in fact kick off the request but apparently that is not correct.

Here is what I was trying to do:

$request = [System.Net.WebRequest]::Create("http://myserver.com/myservice/dosomething")
$request.GetResponse()

The operation accepts no parameters and returns void.

like image 882
devlife Avatar asked Jan 04 '10 23:01

devlife


2 Answers

PowerShell 2.0 makes this trivial with the New-WebServiceProxy cmdlet e.g.:

$zip = New-WebServiceProxy -uri http://www.webservicex.net/uszip.asmx?WSDL
$zip.getinfobyzip(20500).table

CITY      : Washington
STATE     : DC
ZIP       : 20500
AREA_CODE : 202
TIME_ZONE : E
like image 60
Keith Hill Avatar answered Oct 14 '22 17:10

Keith Hill


I think the problem is that the code you have is actually creating an HttpWebRequest, not a WCF request. (In other words, it's simply executing an HTTP GET request on the URL, with no SOAP or .NET Remoting information.)

You should be able to follow these instructions to create a proper endpoint:

http://msdn.microsoft.com/en-us/magazine/cc163647.aspx#S11

It should look something like this:

$httpBinding = New-Object System.ServiceModel.BasicHttpBinding
$endpointAddress = New-Object System.ServiceModel.EndpointAddress 'http://myserver.com/myservice/dosomething'
$contractDescription = [System.ServiceModel.Description.ContractDescription]::GetContract([IYourInterface], $httpBinding, $endpointAddress)
$serviceEndpoint = New-Object System.ServiceModel.Description.ServiceEndpoint $contractDescription
$channelFactory = New-Object "System.ServiceModel.ChannelFactory``1[IYourInterface]" $serviceEndpoint
$webProxy = $channelFactory.CreateChannel();
$webProxy.yourServiceMethod();

Note that you'll need to import the DLL with the IYourInterface class for this to work:

[void] [Reflection.Assembly]::LoadFrom('path/to/your.dll')

Alternatively, if you have a WSDL defined for the service, you can follow these much easier instructions to access the service:

http://blogs.technet.com/heyscriptingguy/archive/2009/11/17/hey-scripting-guy-november-17-2009.aspx

Alternatively alternatively, you can figure out what the HTTP SOAP request needs to look like, and form it yourself within the HttpWebRequest.

like image 44
jdmichal Avatar answered Oct 14 '22 18:10

jdmichal