找回密码
 FreeOZ用户注册
查看: 5924|回复: 2
打印 上一主题 下一主题

[软件推荐] MSDN上发现了一篇很好的WCF入门教程

[复制链接]
跳转到指定楼层
1#
发表于 11-7-2008 18:53:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
提示: 作者被禁止或删除, 无法发言

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
看了很多学习WCF的例子,感觉受益匪浅,但是由于每个人学习的侧重点不同,一些很详细的细节例如每一个属性都是用来干什么的,建立不同的项目类型对创建的服务有什么区别等等,都不得而知。终于,在MSDN上发现了一篇入门教程。讲解的十分基本,十分详细,想进到每一个细节,然我彻底了解入门的每一个细节,整个教程结构清晰,代码简洁,讲解细致,值得推荐。

地址: http://msdn.microsoft.com/en-us/library/ms734712.aspx

做这分5部来讲解创建一个最基本的基于B/S构架的WCF应用。服务是根据输入的两个数字,返回这两个数字的加减乘除运算结果。

第一步:定义WCF服务契约(创建项目,加入引用,定义Interface)
第二部:引入WCF服务契约(添加具体服务函数)
第三部:构架WCF服务,运行WCF服务(添加Uri,定义服务对象地址,运行服务)
第四部:利用工具访问服务,自动生成WCF服务代理的代码文件
第五部:配置一个简单的WCF客户端(用客户端引入服务代理,通过服务代理来访问服务)
第六部:运行程序

先建立一个解决方案。
在这个解决方案下面建立一个叫做Server的控制台应用项目,再建立一个叫做Client的控制台应用项目。
分别给每一个项目添加引用到System.ServiceModel
编辑每个项目下面的Program.cs

服务端Program.cs代码
  1. 1using System;
  2. 2using System.Collections.Generic;
  3. 3using System.Text;
  4. 4using System.ServiceModel;
  5. 5
  6. 6namespace ServiceModelSamples
  7. 7{
  8. 8
  9. 9    class Client
  10. 10    {
  11. 11        static void Main()
  12. 12        {
  13. 13            //Step 1: Create an endpoint address and an instance of the WCF Client.
  14. 14            EndpointAddress epAddress = new EndpointAddress("http://localhost:8000/ServiceModelSamples/Service/CalculatorService");
  15. 15            CalculatorClient client = new CalculatorClient(new WSHttpBinding(), epAddress);
  16. 16
  17. 17
  18. 18            // Step 2: Call the service operations.
  19. 19            // Call the Add service operation.
  20. 20            double value1 = 100.00D;
  21. 21            double value2 = 15.99D;
  22. 22            double result = client.Add(value1, value2);
  23. 23            Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
  24. 24
  25. 25            // Call the Subtract service operation.
  26. 26            value1 = 145.00D;
  27. 27            value2 = 76.54D;
  28. 28            result = client.Subtract(value1, value2);
  29. 29            Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
  30. 30
  31. 31            // Call the Multiply service operation.
  32. 32            value1 = 9.00D;
  33. 33            value2 = 81.25D;
  34. 34            result = client.Multiply(value1, value2);
  35. 35            Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
  36. 36
  37. 37            // Call the Divide service operation.
  38. 38            value1 = 22.00D;
  39. 39            value2 = 7.00D;
  40. 40            result = client.Divide(value1, value2);
  41. 41            Console.WriteLine("Divide({0},{1}) = {2}", value1, value2, result);
  42. 42
  43. 43            //Step 3: Closing the client gracefully closes the connection and cleans up resources.
  44. 44            client.Close();
  45. 45
  46. 46            Console.WriteLine();
  47. 47            Console.WriteLine("Press <ENTER> to terminate client.");
  48. 48            Console.ReadLine();
  49. 49
  50. 50
  51. 51        }
  52. 52    }
  53. 53}
  54. 54
复制代码
服务端创建好了以后,就可以试运行了。
这时候可以用微软提供的命令行工具访问这个服务,生成服务代理 app.config 和 generatedProxy.cs两个文件。

svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config http://localhost:8000/ServiceModelSamples/service

把这两个文件添加到客户端项目里去。
现在就可以编辑客户端代码了。

客户端Program.cs代码
  1.   1using System;
  2.   2using System.ServiceModel;
  3.   3using System.ServiceModel.Description;
  4.   4
  5.   5namespace Microsoft.ServiceModel.Samples
  6.   6{
  7.   7    // Define a service contract.
  8.   8    [ServiceContract(Namespace = "http://Microsoft.ServiceModel.Samples")]
  9.   9    public interface ICalculator
  10. 10    {
  11. 11        [OperationContract]
  12. 12        double Add(double n1, double n2);
  13. 13        [OperationContract]
  14. 14        double Subtract(double n1, double n2);
  15. 15        [OperationContract]
  16. 16        double Multiply(double n1, double n2);
  17. 17        [OperationContract]
  18. 18        double Divide(double n1, double n2);
  19. 19    }
  20. 20
  21. 21    // Service class that implements the service contract.
  22. 22    // Added code to write output to the console window.
  23. 23    public class CalculatorService : ICalculator
  24. 24    {
  25. 25        public double Add(double n1, double n2)
  26. 26        {
  27. 27            double result = n1 + n2;
  28. 28            Console.WriteLine("Received Add({0},{1})", n1, n2);
  29. 29            Console.WriteLine("Return: {0}", result);
  30. 30            return result;
  31. 31        }
  32. 32
  33. 33        public double Subtract(double n1, double n2)
  34. 34        {
  35. 35            double result = n1 - n2;
  36. 36            Console.WriteLine("Received Subtract({0},{1})", n1, n2);
  37. 37            Console.WriteLine("Return: {0}", result);
  38. 38            return result;
  39. 39        }
  40. 40
  41. 41        public double Multiply(double n1, double n2)
  42. 42        {
  43. 43            double result = n1 * n2;
  44. 44            Console.WriteLine("Received Multiply({0},{1})", n1, n2);
  45. 45            Console.WriteLine("Return: {0}", result);
  46. 46            return result;
  47. 47        }
  48. 48
  49. 49        public double Divide(double n1, double n2)
  50. 50        {
  51. 51            double result = n1 / n2;
  52. 52            Console.WriteLine("Received Divide({0},{1})", n1, n2);
  53. 53            Console.WriteLine("Return: {0}", result);
  54. 54            return result;
  55. 55        }
  56. 56    }
  57. 57
  58. 58
  59. 59    class Program
  60. 60    {
  61. 61        static void Main(string[] args)
  62. 62        {
  63. 63
  64. 64            // Step 1 of the address configuration procedure: Create a URI to serve as the base address.
  65. 65            Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service");
  66. 66
  67. 67            // Step 1 of the hosting procedure: Create ServiceHost
  68. 68            ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress);
  69. 69            try
  70. 70            {
  71. 71
  72. 72
  73. 73                // Step 3 of the hosting procedure: Add a service endpoint.
  74. 74                selfHost.AddServiceEndpoint(
  75. 75                    typeof(ICalculator),
  76. 76                    new WSHttpBinding(),
  77. 77                    "CalculatorService");
  78. 78
  79. 79
  80. 80                // Step 4 of the hosting procedure: Enable metadata exchange.
  81. 81                ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
  82. 82                smb.HttpGetEnabled = true;
  83. 83                selfHost.Description.Behaviors.Add(smb);
  84. 84
  85. 85                // Step 5 of the hosting procedure: Start (and then stop) the service.
  86. 86                selfHost.Open();
  87. 87                Console.WriteLine("The service is ready.");
  88. 88                Console.WriteLine("Press <ENTER> to terminate service.");
  89. 89                Console.WriteLine();
  90. 90                Console.ReadLine();
  91. 91
  92. 92                // Close the ServiceHostBase to shutdown the service.
  93. 93                selfHost.Close();
  94. 94            }
  95. 95            catch (CommunicationException ce)
  96. 96            {
  97. 97                Console.WriteLine("An exception occurred: {0}", ce.Message);
  98. 98                selfHost.Abort();
  99. 99            }
  100. 100        }
  101. 101    }
  102. 102}
  103. 103
复制代码
每一个细节都包含在上面的这两个Program.cs文件中了,你大概看一下就会懂。比大多数教材说得都清晰,特别适合像我一样爱刨根问底的初学者。
最后编译程序,试运行。(两个都是命令行程序,直接到那个编译好的目录里去找那个exe文件运行,先运行服务,再运行客户端)。

评分

参与人数 1威望 +20 收起 理由
flyspirit + 20 谢谢分享!

查看全部评分

回复  

使用道具 举报

2#
发表于 14-7-2008 11:34:59 | 只看该作者
谢谢楼主,WCF是个好东西
回复  

使用道具 举报

3#
发表于 14-7-2008 13:22:12 | 只看该作者
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 17-11-2024 08:25 , Processed in 0.031705 second(s), 20 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表