服务契约描述了暴露给外部的类型(接口或类)、服务所支持的操作、使用的消息交换模式和消息的格式。每个WCF服务必须实现至少一个服务契约。使用服务契约必须要引用命名空间System.ServiceModel 。
 
ServiceContractAttribute
OperationContractAttribute
 
1,先创建一个类库为ClassLibrary1,在创建一个接口interface1。
2,添加引用和命名空间,System.ServiceModel
3,在接口里代码如下:
namespace ClassLibrary1
{    //服务契约
    [ServiceContract]
   public interface Interface1
    { //操作契约
        [OperationContract]
        string Hello();
    }
}
4,创建一个窗体或控制台程序并创建一个类HelloClass.cs
5,添加引用(项目里面)ClassLibrary1
6,HelloClass1.cs里代码如下

class HelloClass:ClassLibrary1.Interface1
    {

public string Hello()
        {
          return   "Hello wcf!";

}
    }

基本创建一个服务。创建之后需要部署。一般分为配置文件部署和代码部署。

一,配置文件部署
服务的三要素

A:Address 意味着在哪里(也含有传输方式信息)

B:Binding 意味着怎么做(与地址的传输方式要匹配)

C:Contract意味着做什么(服务契约)

<system.ServiceModel>

<services>

<service>

<endpoint/>     /*服务和终结点*/

</service>

</services>

<bindings>     /*绑定(可选)*/

<binding>

</binding>

</bindings>

<behaviors>    /*行为(可选) */

<behavior>

</behavior>

</behaviors>

</system.ServiceModel>

终结点的地址由EndpointAddress 类表示,该类包含一个表示服务地址的统一资源定位符(URI),大多数传输的地址URI 包含四个部分。
例如,

“http://www.sina.com.cn:3200/mathservice”这个URI 具有以下四个部分:

– 方案:http:

– 计算机:www.sina.com.cn

– (可选)端口:3200

– 路径:/mathservice

在上面例题上继续完善,打开app.config文件
<system.serviceModel>
    <services>
      <service name="ConsoleApplication1.HelloClass" behaviorConfiguration="testBehavior"> <!--name为实现该契约的类-->
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8002/test"></add><!--基地址-->
          </baseAddresses>
        </host>
        <endpoint address="" binding="basicHttpBinding" contract="ClassLibrary1.Interface1"></endpoint>
          <!--已有baseAddress基地址,address可为空;binding为绑定类型,对应Http协议;contract为所公开的协议,即所创建的服务契约接口-->
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="testBehavior"> <!--与上面behaviorConfiguration="testBehavior"保持一致,可为空-->
          <serviceMetadata httpGetEnabled="true"/> <!--指定是否要发布元数据以HTTP/Get获取-->
        </behavior>
      </serviceBehaviors>
    </behaviors>
    </system.serviceModel> 
之后需要启动服务
在ConsoleApplication1的program.cs里添加应用和命名空间System.ServiceModel和以下代码

ServiceHost host = null;

host = new ServiceHost(typeof(ConsoleApplication1.HelloClass));
            host.Open();
            Console.WriteLine("服务已经启动!");
            Console.ReadLine();

运行代码后,将http://localhost:8002/test在浏览器打开将会看到相关服务信息。
 
二,代码部署
先创建一个控制台程序 ConsoleApplication2,添加一个类HelloClass.cs和引用及命名空间,服务接口
在program.cs 添加命名空间
            ServiceHost host = null;
            host = new ServiceHost(typeof(ConsoleApplication2.HelloClass));
            NetTcpBinding tcpBind = new NetTcpBinding();//设定绑定类型
            string address = "net.tcp://localhost:3200/hello";
            host.AddServiceEndpoint(typeof(ClassLibrary1.Interface1), tcpBind, address);//在服务终结点添加,协议,绑定类型,终结点地址
            host.Opened += delegate { Console.WriteLine("服务已启动!"); Console.ReadLine(); };
            host.Open();
当服务部署成功后,客户端可以连接服务并调用方法,一般有两种方式
一,如上一节讲的直接添加服务引用来实现
二,纯代码实现
先创建一个客户端,client控制台程序以及相关引用、命名空间、服务接口引用

//绑定形式
            NetTcpBinding bind = new NetTcpBinding();
            //提供客服端与服务建立连接的地址
            EndpointAddress address = new EndpointAddress("net.tcp://localhost:3200/hello");
            //客户端通关通道工厂将消息发送到不同配置的服务终结点
            ChannelFactory<ClassLibrary1.Interface1> factory = new ChannelFactory<ClassLibrary1.Interface1>(bind, address);
            //通过通道工厂对象来获取指定类型
            ClassLibrary1.Interface1 myobject = factory.CreateChannel();
            string s = myobject.Hello();
            Console.WriteLine(s);
            Console.ReadLine();

先启动服务,在运行客户端。

 
 
 
 
 

C# WCF之用接口创建服务契约、部署及客户端连接的更多相关文章

  1. MongoDB的基本操作:服务端启动,客户端连接,CRUD操作

    本文内容: MongoDB的介绍 MongoDB服务端的启动 MongoDB客户端连接 SQL与MongoDB相关概念解释 什么是BSON 数据库操作 集合操作 文档操作 测试环境:win10 软件版 ...

  2. WCF分布式开发步步为赢(5)服务契约与操作重载

    继上一节WCF分布式开发步步为赢系列的(4):WCF服务可靠性传输配置与编程开发,本节我们继续学习WCF分布式开发步步为赢的第(5)节:服务契约与操作重载.这里我们首先讲解OOP面向对象的编程中方法重 ...

  3. C# Socket服务端及多客户端连接通信实现

    服务端代码(控制台示例): static List<Socket> Sockets = new List<Socket>(); static void Main(string[ ...

  4. WCF分布式开发步步为赢(6):WCF服务契约继承与分解设计

    上一节我们学习了WCF分布式开发步步为赢(5)服务契约与操作重载部分.今天我们来继续学习WCF服务契约继承和服务分解设计相关的知识点.WCF服务契约继承有何优势和缺点?实际项目里契约设计有什么原则和依 ...

  5. 跟我一起学WCF(6)——深入解析服务契约[下篇]

    一.引言 在上一篇博文中,我们分析了如何在WCF中实现操作重载,其主要实现要点是服务端通过ServiceContract的Name属性来为操作定义一个别名来使操作名不一样,而在客户端是通过重写客户端代 ...

  6. WCF契约之---服务契约 、数据契约、 消息契约

    本篇博文只是简单说下WCF中的契约的种类.作用以及一些简单的代码示例.在WCF中契约分为服务契约.数据契约和消息契约.下面对这几种契约进行简单的介绍. 服务契约 服务契约描述了暴露给外部的类型(接口或 ...

  7. 一、WCF学习之旅-创建第一个服务

    WCF基本介绍:http://baike.baidu.com/link?url=TGjLYt3HS4dt4-hIiGRknLy6udRsZ52QxJz9cmRKlR4NXbP9rCZDsKn2fDfG ...

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

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

  9. 跟我一起学WCF(5)——深入解析服务契约[上篇]

    一.引言 在上一篇博文中,我们创建了一个简单WCF应用程序,在其中介绍到WCF最重要的概念又是终结点,而终结点又是由ABC组成的.对于Address地址也就是告诉客户端WCF服务所在的位置,而Cont ...

随机推荐

  1. POJ 1797 最短路变形所有路径最小边的最大值

    题意:卡车从路上经过,给出顶点 n , 边数 m,然后是a点到b点的权值w(a到b路段的承重),求卡车最重的重量是多少可以从上面经过. 思路:求所有路径中的最小的边的最大值.可以用迪杰斯特拉算法,只需 ...

  2. 记录---java中jsp页面引入jquery路径的问题

    今天在jsp页面中引入jquery的时候因为路径不对总是报404,网上的方法找到几种试了试但是最后结果还是不生效,遂想起原先的项目中有引入外部jquery的例子,所以立马看了看,发现当时的项目中是用$ ...

  3. Educational Codeforces Round 83 (Rated for Div. 2)

    A. Two Regular Polygons 题意:给你一个 正n边形,问你能否以这个 n 的其中一些顶点组成一个 m边形, 思路 :如果 n % m == 0 ,就可 收获:边均分 B. Bogo ...

  4. Java并发基础09. 多个线程间共享数据问题

    先看一个多线程间共享数据的问题: 设计四个线程,其中两个线程每次对data增加1,另外两个线程每次对data减少1. 从问题来看,很明显涉及到了线程间通数据的共享,四个线程共享一个 data,共同操作 ...

  5. Lisp-01: 相关开发环境配置部署

    Common Lisp 学习笔记系列01 要学一门编程语言,首先需要将语言的环境配置好.如果想要个直接上手的环境,感谢日本的大神 Shirakumo,打造了一个 Common Lisp 的 IDE - ...

  6. 大O表示法是什么?

    1.什么是大O表示法: 1.在算法描述中,我们用这种方式来描述计算机算法的效率. 2.在计算机中,这种粗略的量度叫做 "大O" 表示法. 3.在具体的情境中,利用大O表示法来描述具 ...

  7. Tomcat目录解析

    bin 可执行文件的储存 conf 配置文件 lib 依赖jar包 logs 日志文件 temp 临时文件 webapps 创建的web应用程序 work 存放运行时数据 如何启动Tomcat? 启动 ...

  8. .NET 下基于动态代理的 AOP 框架实现揭秘

    .NET 下基于动态代理的 AOP 框架实现揭秘 Intro 之前基于 Roslyn 实现了一个简单的条件解析引擎,想了解的可以看这篇文章 https://www.cnblogs.com/weihan ...

  9. 15-场景中用到的资源监视器(perfmon metrics collector)

    JMeter 无法提取除 Tomcat 之外的其他服务器的指标,因此PerfMon Metrics Collector可用来获取性能数据. PerfMon Metrics Collector使用的是S ...

  10. tf.train.GradientDescentOptimizer 优化器

    tf.train.GradientDescentOptimizer(learning_rate, use_locking=False,name='GradientDescent') 参数: learn ...