Mar 232008
 

WCF is seamless, powerful, and (YES) interoperable. Here is a quick walkthrough detailing steps to call your legacy PHP web services from a WCF client. All of the binding types and security options are, of course, not available. But for those of you following the old “security through obscurity” model, this will work fine.

The procedure is just as simple as a WCF-WCF call:

  1. Create client proxy
  2. Add client endpoint to your client config file
  3. Write your proxy-consuming client code

Create the client proxy:


Nusoap provides a similar UI when navigating to your PHP web service to that provided by ASMX services. You can view the WSDL, and copy the URL for svcutil.exe.



From the Visual Studio 2005 Command Prompt, type:


svcutil <url> /out:<name>Proxy.cs /noconfig
svcutil http://gotjeep.net/services/ApproachAngleService.php?wsdl /out:ApproachAngleServiceProxy.cs /noconfig



This generates a file named ApproachAngleServiceProxy.cs.




    1 //——————————————————————————


    2 // <auto-generated>


    3 //    This code was generated by a tool.


    4 //    Runtime Version:2.0.50727.1433


    5 //


    6 //    Changes to this file may cause incorrect behavior and will be lost if


    7 //    the code is regenerated.


    8 // </auto-generated>


    9 //——————————————————————————


   10 


   11 


   12 


   13 [System.CodeDom.Compiler.GeneratedCodeAttribute(“System.ServiceModel”, “3.0.0.0”)]


   14 [System.ServiceModel.ServiceContractAttribute(Namespace=“http://www.gotjeep.net/tech”, ConfigurationName=“GotJeepApproachAngleCalculatorPortType”)]


   15 public interface GotJeepApproachAngleCalculatorPortType


   16 {


   17 


   18     [System.ServiceModel.OperationContractAttribute(Action=“http://www.gotjeep.net/services/approachAngleService.php/CalculateApproachAngle”, ReplyAction=“*”)]


   19     [System.ServiceModel.XmlSerializerFormatAttribute(Style=System.ServiceModel.OperationFormatStyle.Rpc, Use=System.ServiceModel.OperationFormatUse.Encoded)]


   20     [return: System.ServiceModel.MessageParameterAttribute(Name=“return”)]


   21     decimal CalculateApproachAngle(decimal height, decimal diameter, decimal distance);


   22 }


   23 


   24 [System.CodeDom.Compiler.GeneratedCodeAttribute(“System.ServiceModel”, “3.0.0.0”)]


   25 public interface GotJeepApproachAngleCalculatorPortTypeChannel : GotJeepApproachAngleCalculatorPortType, System.ServiceModel.IClientChannel


   26 {


   27 }


   28 


   29 [System.Diagnostics.DebuggerStepThroughAttribute()]


   30 [System.CodeDom.Compiler.GeneratedCodeAttribute(“System.ServiceModel”, “3.0.0.0”)]


   31 public partial class GotJeepApproachAngleCalculatorPortTypeClient : System.ServiceModel.ClientBase<GotJeepApproachAngleCalculatorPortType>, GotJeepApproachAngleCalculatorPortType


   32 {


   33 


   34     public GotJeepApproachAngleCalculatorPortTypeClient()


   35     {


   36     }


   37 


   38     public GotJeepApproachAngleCalculatorPortTypeClient(string endpointConfigurationName) :


   39             base(endpointConfigurationName)


   40     {


   41     }


   42 


   43     public GotJeepApproachAngleCalculatorPortTypeClient(string endpointConfigurationName, string remoteAddress) :


   44             base(endpointConfigurationName, remoteAddress)


   45     {


   46     }


   47 


   48     public GotJeepApproachAngleCalculatorPortTypeClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress) :


   49             base(endpointConfigurationName, remoteAddress)


   50     {


   51     }


   52 


   53     public GotJeepApproachAngleCalculatorPortTypeClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress) :


   54             base(binding, remoteAddress)


   55     {


   56     }


   57 


   58     public decimal CalculateApproachAngle(decimal height, decimal diameter, decimal distance)


   59     {


   60         return base.Channel.CalculateApproachAngle(height, diameter, distance);


   61     }


   62 }


 


Add client endpoint to your config file:


You have the option of letting svcutil create your config file or using “Generate Service Reference”, but I prefer to avoid the extra 20+ lines of config file defaults included by svcutil. It’s not hard to write it yourself, and it ensures a much more readable config file.




    1 <?xml version=1.0 encoding=utf-8?>


    2 <configuration>


    3     <system.serviceModel>


    4         <bindings>


    5             <basicHttpBinding>


    6               <binding name=GotJeepApproachAngleCalculatorBinding>


    7                 <security mode=None/>


    8               </binding>


    9             </basicHttpBinding>


   10         </bindings>


   11         <client>


   12             <endpoint address=http://www.gotjeep.net/services/approachAngleService.php


   13                 binding=basicHttpBinding


   14                 bindingConfiguration=GotJeepApproachAngleCalculatorBinding


   15                 contract=GotJeepApproachAngleCalculatorPortType


   16                 name=GotJeepApproachAngleCalculatorPort />


   17         </client>


   18     </system.serviceModel>


   19 </configuration>


 


Write the client code:


    1 using System;

    2 

    3 namespace Client

    4 {

    5     class Program

    6     {

    7         static void Main(string[] args)

    8         {

    9             using (GotJeepApproachAngleCalculatorPortTypeClient proxy =

   10                 new GotJeepApproachAngleCalculatorPortTypeClient())

   11             {

   12                 decimal result = proxy.CalculateApproachAngle(25.6m, 33.2m, 17.75m);

   13                 Console.WriteLine(“decimal result = proxy.CalculateApproachAngle(25.6m, 33.2m, 17.75m);”);

   14                 Console.WriteLine(“result = “ + result.ToString(“0.00”));

   15             }

   16         }

   17     }

   18 }


 


Check it out:


A request-reply call between WCF and a Nusoap PHP web service.


 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

Time limit is exhausted. Please reload the CAPTCHA.