WCF学习笔记(二),服务契约
来源:互联网 发布:限制端口上网怎么解 编辑:程序博客网 时间:2024/05/21 21:35
一、服务契约介绍
我个人理解服务契约是一组公开的操作,其中公开的操作(OperationContract)只能定义在方法(Method)上。对于我们要公开的服务我们可以在接口或者类上加上标识ServiceContract。但是我们一般情况下,会把ServiceContract定义在接口上而不是类上,这样有几个好处:
1.方便契约的继承,不同的类型可以去实现相同的契约,重用性高。
2.同一服务可以去实现多个契约。
3.可以随时去修改服务类型,而不需去修改接口。
下面定义一个服务的契约:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Service
{
[ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
public interface ICalucator
{
[OperationContract]
int Add(int x, int y);
}
}
我们在上面首先定义了一个接口名称为:ICalucator,然后我们要将这个接口公开为服务契约在上面加上属性标识[ServiceContract],其中Name可以为契约指定别名,这样的话,如果我们在客户端遇到相同的接口时可以通过Name来制定别名区别开来。公开的操作为Add方法,在上面标识[OperationContract]即可。
二、方法的重载
按照我们正常的方法去重载的话,只需要方法的参数不同(个数、类型)就可以实现方法的重载。但是我们在服务契约的定义的时候是不能怎样的,wdsl是编译同不过的如:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Service
{
[ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
public interface ICalucator
{
[OperationContract]
int Add(int x, int y);
[OperationContract]
double Add(double x, double y);
}
}
上面的方法是编译不能通过的。但是我们有一种解决的办法可以去解决这样的问题,就是通过OperationContract的Name属性来设定方法的别名是实现方法的重载。如:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
namespace Service
{
[ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
public interface ICalucator
{
[OperationContract(Name="IntAdd")]
int Add(int x, int y);
[OperationContract(Name="DoubleAdd")]
double Add(double x, double y);
}
}
下面我们通过数据元的方式来配置一个宿主主机,我们添加一个控制台的程序,通过配置App.Config来实现。
在App.Config中:
<configuration>
<system.serviceModel>
<services>
<service name="Service.Calucator" behaviorConfiguration="mex">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888"/>
baseAddresses>
host>
<endpoint address="Calucator" binding="basicHttpBinding" contract="Service.ICalucator">endpoint>
service>
services>
<behaviors>
<serviceBehaviors>
<behavior name="mex">
<serviceMetadata httpGetEnabled="true"/>
behavior>
serviceBehaviors>
behaviors>
system.serviceModel>
configuration>
在主程序中:
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Service;
namespace Host
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = null;
try
{
host = new ServiceHost(typeof(Calucator));
host.Open();
Console.Write("Host is opening now! Press any key to stop");
Console.Read();
}
finally
{
host.Close();
}
}
}
}
然后我们启动主机,在浏览器中输入地址:http://www.systhinker.com/?wsdl 。我们可以看到:
我们可以看到wsdl编译时已经将名称编译成为了我们Name中定义的别名。
WCF学习笔记系列链接:
WCF学习笔记(一),WCF预览
WCF学习笔记(二),服务契约
WCF学习笔记(三),数据契约
WCF学习笔记(四),数据契约的事件
WCF学习笔记(五),数据契约的已知类型
WCF学习笔记(六),实例类型
- WCF学习笔记(二),服务契约
- [WCF 学习笔记] 2. 服务契约
- [WCF 学习笔记] 2. 服务契约
- WCF学习(二):契约
- wcf学习笔记4 定义服务契约contract
- WCF学习笔记(三),数据契约
- WCF学习笔记——契约(Contract)
- WCF学习笔记——契约(Contract)
- 【学习】构建WCF面向服务的应用程序系列课程笔记:(2) 契约设计
- 【学习】构建WCF面向服务的应用程序系列课程笔记:(3)契约版本处理
- WCF契约设计: 服务契约,数据契约和消息契约
- WCF契约之---服务契约 、数据契约、 消息契约
- WCF学习笔记(二)使用Name等属性和数据契约
- (2) 第二章 WCF服务与数据契约 服务契约详解(二)- 如何引用WCF提供的服务
- WCF学习(2)- 契约
- 深入学习WCF-契约
- WCF契约 学习备忘
- 《WCF按部就班学习系列2_WCF服务契约概述》
- WCF学习笔记(一),WCF预览
- 火线 零线 中线 地线
- 安装SQL Server2000 与 SP4补丁时挂起解决
- 在不同操作系统中安装SNMP代理
- emacs, 配一个简单的ide
- WCF学习笔记(二),服务契约
- 定制new和delete(Cpp Operators of new and delete)
- 一部神作的诞生
- snmp无法启动--snmpd dead but pid file exists
- 用C++链式栈解决数据结构中的括号匹配问题。
- [笔记] 如何在Windows下编译 cdrtools
- 编制一个能演示执行集合的并、交和差运算的程序。(有序表)
- 介绍NPTL (经典--诠释了线程的概念,以及linux调度单位)
- 20101022被面试的一些题(.net)