步骤一:定义契约

[ServiceContract]     //定义服务契约   需要引用System.ServiceModel
public interface ICalculator
{
[OperationContract] //定义消息契约
double Add(double x, double y);
[OperationContract]
double Subtract(double x, double y);
[OperationContract]
double Multiply(double x, double y);
[OperationContract]
double Divide(double x, double y);
}

步骤二:创建服务

public class CalculatorService:ICalculator   //继承服务契约
{
public double Add(double x, double y)
{
return x + y;
}
public double Subtract(double x, double y)
{
return x - y;
}
public double Multiply(double x, double y)
{
return x * y;
}
public double Divide(double x, double y)
{
return x / y;
}
}

步骤三:服务寄宿(通过控制台寄宿)

static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) // 承载服务
{
host.AddServiceEndpoint(typeof(ICalculator), new WSHttpBinding(), "http://localhost:3721/CalculatorService"); // 增加节点到承载服务,参数是:契约、绑定、地址
if (host.Description.Behaviors.Find<ServiceMetadataBehavior>() == null)
{
ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); //定义服务行为
behavior.HttpGetEnabled = true; //是否发布服务元数据,方便使用GET-HTTP进行检索
behavior.HttpGetUrl = new Uri("http://localhost:3721/CalculatorService/metadata"); //获取或设置元数据的发布地址
host.Description.Behaviors.Add(behavior); //添加服务行为到承载服务
}
host.Opened += delegate
{
Console.WriteLine("服务已经开启,按任意键终止");
};
host.Open();
Console.Read();
}
}

步骤四:服务端通过配置文件配置服务

xml:

<configuration>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="metadataBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="http://127.0.0.1:3722/CalculatorService/metadata"/>
</behavior>
</serviceBehaviors>
</behaviors> <services>
<service name="Service.CalculatorService" behaviorConfiguration="metadataBehavior">
<endpoint address="http://127.0.0.1:3722/CalculatorService" binding="wsHttpBinding"
bindingConfiguration="" name="Test" contract="Service.Interface.ICalculator" />
</service>
</services>
</system.serviceModel>
</configuration>

c#

static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(CalculatorService))) // 承载服务
{
host.Opened += delegate
{
Console.WriteLine("服务已经开启,按任意键终止");
};
host.Open();
Console.Read();
}
}

步骤五:客户端调用 (不通过代理类的方式)

static void Main(string[] args)
{
//客户端调用,不通过代理类,通过ChannelFactory直接创建服务代理对象
//条件:需要引用契约动态库
using (ChannelFactory<ICalculator> channelFactory = new ChannelFactory<ICalculator>(new WSHttpBinding(), "http://127.0.0.1:3722/CalculatorService"))
{
ICalculator calcuator = channelFactory.CreateChannel(); //创建服务代理对象
Console.WriteLine("5+5={0}", calcuator.Add(, ));
Console.WriteLine("5-5={0}", calcuator.Subtract(, ));
Console.WriteLine("5*5={0}", calcuator.Multiply(, ));
Console.WriteLine("5/5={0}", calcuator.Divide(, ));
}
Console.Read();
}

wcf服务编程(一)的更多相关文章

  1. WCF服务编程

    WCF服务编程, 我是WCF的初学者,在这想分享学习WCF服务编程的过程,欢迎大家多多指教!

  2. WCF服务编程 读书笔记——第2章 服务契约

    操作重载诸如 C++ 和 C# 等编程语言都支持方法重载,即允许具有相同名称的两个方法可以定义不同的参数.例如,如下的 C# 接口就是有效的定义: interface ICalculator { in ...

  3. WCF服务编程 读书笔记——第1章 WCF基础(2)

    续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...

  4. WCF服务编程 读书笔记——第1章 WCF基础(1)

    第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...

  5. WCF服务编程-基础

    WCF是微软建立新一代的分布式应用及面向服务应用的标准平台,是基于原有.NET Framework 2.0的扩展.虽然在WCF发布不久就已经在项目中使用WCF技术了.但是由于在项目中还没有较大规模的应 ...

  6. WCF 服务编程 - 常用绑定

    WCF  定义了5中常用的绑定. 一. 绑定 1.基本绑定: 对应于BasicHttpBinding类.基本绑定能够将WCF服务公开为传统的ASMX Web服务,使得原客户端能够与新的服务协作.如果客 ...

  7. WCF服务编程中使用SvcMap实现类型共享等技巧【转】

    原文链接:http://www.cr173.com/html/19026_1.html 国外的一篇文章:Sharing DataContracts between WCF Services 文中提到的 ...

  8. wcf服务编程(第3版)文摘

    第1章 wcf基础 什么是wcf: System.ServiceModel.dll 服务 服务的执行边界: proxy 地址:http/https,tcp,ipc,peer newwork,msmq, ...

  9. WCF服务编程——数据契约快速入门

    WCF序列化流程 序列化 默认用户自定义类型(类和结构)并不支持序列化,因为.NET无法判断对象状态是否需要反射到流. 用户自定义类的实例支持序列化 需要添加[Serialazable].若要允许可序 ...

随机推荐

  1. Post ,Get 请求

    http://blog.csdn.net/pan_junbiao/article/details/9155497

  2. 图像滤镜艺术---(Sketch Filter)素描滤镜

    原文:图像滤镜艺术---(Sketch Filter)素描滤镜 (Sketch Filter)素描滤镜 素描滤镜的实现方法比较简单,这里我们直接写出算法过程如下: 1,对原图S进行去色命令得到灰度图A ...

  3. Win8 Metro(C#)数字图像处理--2.54迭代法图像二值化

    原文:Win8 Metro(C#)数字图像处理--2.54迭代法图像二值化  [函数名称]   迭代法图像二值化      int IterativeThSegment(WriteableBitm ...

  4. UWP 发送短信公用倒计时按钮

    1.要求:      发送验证码按钮,点击后,会倒计时60s,之后才能再次点击.不同界面的多个验证码按钮共享这个倒计时时间. 2.操作步骤       1) 从登录界面-->忘记密码输入手机号- ...

  5. UWP ObservableCollection<Evaluate>集合中ObservableCollection<PictureInfo>变更通知到xaml界面

    ObservableCollection<Evaluate> EvaluateList = new ObservableCollection<Evaluate>();//评论集 ...

  6. Python:Pandas学习

    import pandas as pd import numpy as np s = pd.Series([1, 3, 6, np.nan, 44, 1]) df= pd.DataFrame(np.r ...

  7. Delphi检测用户是否具有administrator权限(OpenThreadToken,OpenProcessToken,GetTokenInformation,AllocateAndInitializeSid和EqualSid)

    检测用户是否具有administrator权限const SECURITY_NT_AUTHORITY: TSIDIdentifierAuthority = (Value: (0, 0, 0, 0, 0 ...

  8. FrieMonkey获取手机的IMSI等信息

    procedure THeaderFooterForm.FormCreate(Sender: TObject); var TelephonyManager: JTelephonyManager; Te ...

  9. Qt使Release版本可调试

    只需在pro文件中加入 QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO QMAKE_LFLAGS_RELEASE = $$ ...

  10. 为什么API多用C而不是C++,为什么C++程序大多不使用异常

    读Defective C++随笔 不尽知用兵之害者,则不能尽知用兵之利也 ——<孙子兵法> 1.为什么API多用C而不是C++以前就一直很奇怪,为什么API大都用C的方式提供,即使有C++ ...