wcf client与webservice通信(-)只修改配置文件而改变服务端


问题: 假设有一个大型系统新版本使用wcf 作为服务端,生成wcf client 调用可以调用正常。 那如果当wcf 服务端出现问题或其他的原因我想再用回以前老版本的webservice或是jms server ,但客户端调用还是通过wcf client 调用。只通过更改配置来实现。

 一、web service项目,添加一个普通service class .代码如下:



Code 
  
 <!--

 Code highlighting produced by Actipro CodeHighlighter (freeware)
 http://www.CodeHighlighter.com/
 -->Code
 [WebService(Namespace="http://Microsoft.ServiceModel.Samples")]
     public class CalculatorService : System.Web.Services.WebService
     {        
         [WebMethod]
         public double Add(double n1, double n2)
         {
             return n1 + n2;
         }
         [WebMethod]
         public double Subtract(double n1, double n2)
         {
             return n1 - n2;
         }
         [WebMethod]
         public double Multiply(double n1, double n2)
         {
             return n1 * n2;
         }
         [WebMethod]
         public double Divide(double n1, double n2)
         {
             return n1 / n2;
         }
     }


webservice配置文件无需更改。运行。记录服务地址。

 

二、打开路径C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin:找到svcutil.exe文件。开始菜单-->run --> input cmd --->cd C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin -->回车;

输入svcutil http://localhost:8080/service/service.asmx,将会在C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin生成一个webservice的代理类。注意:此代理类是wcf client形式的。(在后面只需将这个代理类小作改动,便可用于wcf sevice.)

生成的代理类:

 



Code 
  
 <!--

 Code highlighting produced by Actipro CodeHighlighter (freeware)
 http://www.CodeHighlighter.com/
 -->//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//     Runtime Version:2.0.50727.3053
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------



     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
     [System.ServiceModel.ServiceContractAttribute(Namespace = "http://Microsoft.ServiceModel.Samples", ConfigurationName = "CalculatorServiceSoap")]
     public interface CalculatorServiceSoap
     {

         [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/Add", ReplyAction = "*")]
         double Add(double n1, double n2);

         [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/Subtract", ReplyAction = "*")]
         double Subtract(double n1, double n2);

         [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/Multiply", ReplyAction = "*")]
         double Multiply(double n1, double n2);

         [System.ServiceModel.OperationContractAttribute(Action = "http://Microsoft.ServiceModel.Samples/Divide", ReplyAction = "*")]
         double Divide(double n1, double n2);
     }

     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
     public interface CalculatorServiceSoapChannel : CalculatorServiceSoap, System.ServiceModel.IClientChannel
     {
     }

     [System.Diagnostics.DebuggerStepThroughAttribute()]
     [System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
     public partial class CalculatorServiceSoapClient : System.ServiceModel.ClientBase<CalculatorServiceSoap>, CalculatorServiceSoap
     {

         public CalculatorServiceSoapClient()
         {
         }

         public CalculatorServiceSoapClient(string endpointConfigurationName)
             :
                 base(endpointConfigurationName)
         {
         }

         public CalculatorServiceSoapClient(string endpointConfigurationName, string remoteAddress)
             :
                 base(endpointConfigurationName, remoteAddress)
         {
         }

         public CalculatorServiceSoapClient(string endpointConfigurationName, System.ServiceModel.EndpointAddress remoteAddress)
             :
                 base(endpointConfigurationName, remoteAddress)
         {
         }

         public CalculatorServiceSoapClient(System.ServiceModel.Channels.Binding binding, System.ServiceModel.EndpointAddress remoteAddress)
             :
                 base(binding, remoteAddress)
         {
         }

         public double Add(double n1, double n2)
         {
             return base.Channel.Add(n1, n2);
         }

         public double Subtract(double n1, double n2)
         {
             return base.Channel.Subtract(n1, n2);
         }

         public double Multiply(double n1, double n2)
         {
             return base.Channel.Multiply(n1, n2);
         }

         public double Divide(double n1, double n2)
         {
             return base.Channel.Divide(n1, n2);
         }
     }


 

 

三、添加Console Application,将上面生成的代理类加入项目中,并在Main方法中调用。

 


Code 
  
 <!--

 Code highlighting produced by Actipro CodeHighlighter (freeware)
 http://www.CodeHighlighter.com/
 --> Service1Clients client = new Service1Clients();

            //   Service1Client client = new Service1Client();
             // Call the Add service operation.
            double value1 = 100.00D;
             double value2 = 15.99D;
             
             
             
             
             double result = client.Add(value1, value2);
             Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);

             // Call the Subtract service operation.
            value1 = 145.00D;
             value2 = 76.54D;
             result = client.Subtract(value1, value2);
             Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);

             // Call the Multiply service operation.
            value1 = 9.00D;
             value2 = 81.25D;
             result = client.Multiply(value1, value2);
             Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);

             // Call the Divide service operation.
            value1 = 22.00D;
             value2 = 7.00D;
             result = client.Divide(value1, value2);
             Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);

             //Closing the client gracefully closes the connection and cleans up resources
            client.Close();

             Console.WriteLine();
             Console.WriteLine("Press <ENTER> to terminate client.");
             Console.ReadLine();



添加配置文件:App.config.此配置文件在二步生成代理类的时候会有Out.config同时产生。config里面的内容拷过来即可。

 



Code 
  
 <!--

 Code highlighting produced by Actipro CodeHighlighter (freeware)
 http://www.CodeHighlighter.com/
 --><system.serviceModel>
     
      <bindings>
       <basicHttpBinding>
         <binding name="CalculatorServiceSoap" closeTimeout="00:01:00"
             openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
             allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
             maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
             messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
             useDefaultWebProxy="true">
           <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
               maxBytesPerRead="4096" maxNameTableCharCount="16384" />
           <security mode="None">
             <transport clientCredentialType="None" proxyCredentialType="None"
                 realm="" />
             <message clientCredentialType="UserName" algorithmSuite="Default" />
           </security>
         </binding>
       </basicHttpBinding>
     
     </bindings>
     <client>
       
       <endpoint address="http://localhost:8080/service/service.asmx"
          binding="basicHttpBinding"
          contract="IService1" name="IService1" />
     </client>
   </system.serviceModel>

 

 将webservice运行起来,(也可host到iis 里去。)debug console application.即可看到结果。

回家吃饭了。