silverlight3 学习 4.1 初识WCF
创建WCF 服务时,首先应该定义协定。协定指定服务支持的操作,通过定义接口可创建协定。接口中的每个方法都对应于特定的服务操作。每个接口都必须将ServiceContract特性应用于自身,ServiceContract有两个重要的属性Name:服务的名称和Namespace:命名空间;
如果未指定,则默认的命名空间为http://tempuri.org。每个操作都必须将 OperationContract特性应用于自身。如果接口中的一个方法具有 ServiceContract特性但是并没有OperationContract特,则无法通过该服务访问此方法。
[ServiceContract] public interface IMyCalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); }
先以简单示例对WCF有一个初步的认识:
摘自MSDN
开始创建自己的WCF服务
1,首先创建一个控制台应用程序
添加代码:
[ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")] public interface ICalculator { [OperationContract] double Add(double n1, double n2); [OperationContract] double Subtract(double n1, double n2); [OperationContract] double Multiply(double n1, double n2); [OperationContract] double Divide(double n1, double n2); } public class CalculatorService : ICalculator { public double Add(double n1, double n2) { return n1 + n2; } public double Subtract(double n1, double n2) { return n1 - n2; } public double Multiply(double n1, double n2) { return n1 * n2; } public double Divide(double n1, double n2) { return n1 / n2; } }
2,在Main方法下添加如下代码: 注意代码注释行
//创建服务的基础地址,可以设置服务运行端口和IP地址 Uri siteUri = new Uri("http://localhost:8001/ServiceModelSamples/Service"); using (ServiceHost serviceHost = new ServiceHost(typeof(CalculatorService),siteUri)) { try { // 添加公开服务的终结点。必须指定终结点公开的协议、绑定和终结点的地址. WSHttpBinding binding = new WSHttpBinding(); serviceHost.AddServiceEndpoint(typeof(ICalculator), binding, "CalculatorService"); //启用元数据交换 ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; serviceHost.Description.Behaviors.Add(smb); // ServiceDescription sd = serviceHost.Description; // sd.Behaviors.Add(); serviceHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press <ENTER> to terminate service."); Console.ReadLine(); serviceHost.Close(); } catch (InvalidOperationException ioe) { Console.WriteLine(ioe.Message); Console.ReadLine(); } catch (TimeoutException timeProblem) { Console.WriteLine(timeProblem.Message); Console.ReadLine(); } catch (CommunicationException commProblem) { Console.WriteLine(commProblem.Message); Console.ReadLine(); } }
3,运行效果
4, 使用命令行工具创建客户端代码
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service
5,创建一个客户端控制台应用程序
添加generatedProxy.cs和app.config文件.
在Main方法内添加代码
CalculatorClient client = new CalculatorClient(); // Call the Add service operation. double value1 = 100.00; double value2 = 15.99; double result = client.Add(value1, value2); Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result); // Call the Subtract service operation. value1 = 145.00; value2 = 76.54; result = client.Subtract(value1, value2); Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result); // Call the Multiply service operation. value1 = 9.00; value2 = 81.25; result = client.Multiply(value1, value2); Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result); // Call the Divide service operation. value1 = 22.00; value2 = 7.00; result = client.Divide(value1, value2); Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result); //Closing the client releases all communication resources. client.Close(); Console.ReadLine();
6,运行效果:
使用命令行工具创建客户端代码
svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service
5,创建一个客户端控制台应用程序
添加generatedProxy.cs和app.config文件.
在Main方法内添加代码