C# WCF服务入门

时间:2022-05-30 09:13:57

之前在公司用的服务端是wcf写的,但是没有深入研究,最近找工作,面试的时候好多人看到这个总提问,这里做个复习

就用微软官方上的例子,搭一个简单的wcf服务,分6步

1 定义服务协定也就是契约,其实就是定义一个服务接口,这玩意后边是公开客户端用的,然后也告诉后边承载程序应该如何加载服务

  主要涉及两个特性:一个是ServiceContract(接口的特性,定义这个是服务契约,里边又一些设置参数可以设置一下),OperationContract设置接口的方法的,如果不设置,方法就不会呗公开

  这里是直接新建的wcf的服务程序,vs自动给生成了一个接口,,就直接在这个里边添加了几个计算的接口函数了

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace GettingStartedLib { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。 //协定 [ServiceContract(//CallbackContract =typeof(ICallBack),//双工时的返回协定 ConfigurationName = "Calculator",//配置文件重的服务名 Name = "ICalculator",//webservice描述文件重的portType名 Namespace ="",//webservice描述文件重的portType命名空间 ProtectionLevel =System.Net.Security.ProtectionLevel.EncryptAndSign,//保护等级 SessionMode =SessionMode.Allowed)]//设置会话的支持模式 public interface ICalculator { [OperationContract] string GetData(int value); [OperationContract] CompositeType GetDataUsingDataContract(CompositeType composite); //定义方法的操作,带了该特性才会被公布 [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); // TODO: 在此添加您的服务操作 } public interface ICallBack { [OperationContract(IsOneWay = true)] void Reply(string responseToGreeting); } // 使用下面示例中说明的数据约定将复合类型添加到服务操作。 [DataContract] public class CompositeType { bool boolValue = true; string stringValue = "Hello "; [DataMember] public bool BoolValue { get { return boolValue; } set { boolValue = value; } } [DataMember] public string StringValue { get { return stringValue; } set { stringValue = value; } } } }

2 实现上边的接口,vs自动生成了svc文件和对应的svc.cs文件,直接双击就是对应的实现类了,吧接口实现就好了,这个svc文件右键用文本编辑器打开可以进行编辑,如果后边用IIS加载的时候需要修改里边的东西

using System; using System.Collections.Generic; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Web; using System.Text; namespace GettingStartedLib { // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。 // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。 public class Calculator : ICalculator { public string GetData(int value) { return string.Format("You entered: {0}", value); } public CompositeType GetDataUsingDataContract(CompositeType composite) { if (composite == null) { throw new ArgumentNullException("composite"); } if (composite.BoolValue) { composite.StringValue += "Suffix"; } return composite; } public double Add(double n1, double n2) { double result = n1 + n2; Console.WriteLine("Received Add({0},{1})", n1, n2); // Code added to write output to the console window. Console.WriteLine("Return: {0}", result); return result; } public double Subtract(double n1, double n2) { double result = n1 - n2; Console.WriteLine("Received Subtract({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Multiply(double n1, double n2) { double result = n1 * n2; Console.WriteLine("Received Multiply({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } public double Divide(double n1, double n2) { double result = n1 / n2; Console.WriteLine("Received Divide({0},{1})", n1, n2); Console.WriteLine("Return: {0}", result); return result; } } }

3 承载服务,承载服务有几种方式,同时又设计到协议的绑定问题,

  绑定分类:BasicHttpBinding  最基础的http绑定,
        NetTcpbingding  TCP的  

        NetNamePipeBinding  IPC,也就是进程间通信,没用过。。

        WSHttpBinding  这个是特殊的http/Https协议 加了其他东西的

        NetMsmqBindiing,这个是消息队列,我没用过,这玩意好像需要额外装微软的消息队列才可以用

  这里我基本就用wshttpbinding来实现,

  承载方式:1)用控制台程序,直接用servicehost来承载服务,自己构造终结点: