WCF简单例子+Asp.Net MVC调用+WinForm调用

1.创建WCF服务项目:

阐述:WCF服务库与WCF服务应用程序的区别。

WCF服务库,可以认为是一个包含WCF服务以及契约定义的类库。这儿库还不能直接运行,你可以在其他项目里引用,在宿主里启用托管这个库。

而WCF应用程序,是一个可以执行的程序,它有独立的进程,WCF服务类契约的定义,可以直接看到运行的效果。此项目模板应该是基于IIS托管的程序。

前者一般考虑WCF服务设计的时候,服务类的定义为单独的库,可以为其它项目使用。提高代码的复用性。

后者在开发基于IIS托管的WCF服务程序时,比较多见,自学的时候也可以使用这种类型。

当然你也可以修改这些代码,比如把WCF服务程序里的类,移到一个单独的类库里。

1) WCF服务应用程序项目的创建:


WCF服务应用程序的目录结构:


IService1.cs代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Web;

using System.Text;

namespace WcfService

{

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。

    [ServiceContract]

    public interface IService1

    {

        [OperationContract]

        /* 增加车票的方法*/

        void AddTicket(int count);

        [OperationContract]

        /*购买车票的方法*/

        int BuyTickets(int Num);

        [OperationContract]  //服务契约  即提供服务的实现方法

        /*查询车票的方法*/

        int GetRemainingNum();

        // TODO: 在此添加您的服务操作

    }

    // 使用下面示例中说明的数据约定将复合类型添加到服务操作。

    //数据契约 

    [DataContract] 

    public class Ticket

    {

        bool boolCount =true;//判断是否还有车票

        static int howmany = 10;//还有多少车票

        [DataMember]

        //判断是否还有票

        public bool BoolCalue

        {

            get { return boolCount; }

            set

            {

                if (HowMany > 0)

                {

                    boolCount = true;

                }

                else

                {

                    boolCount = false;

                }

            }

        }

        [DataMember]

        //返回票数

        public int HowMany

        {

            get { return howmany; }

            set { howmany = value; }

        }

    }

}

Service1.svc代码:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.ServiceModel.Web;

using System.Text;

namespace WcfService

{

    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“Service1”。

    // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。

    public class Service1 : IService1

    {

        Ticket T = null;

        public Service1() {

            T = new Ticket();

        }

        /*实现添加票数的方法*/

        public void AddTicket(int count)

        {

            T.HowMany = T.HowMany + count;

        }

        /*实现返回票数的方法*/

        public int GetRemainingNum()

        {

            return T.HowMany;

        }

        /*实现购买车票的方法*/

        public int BuyTickets(int Num)

        {

            if (T.BoolCalue)

            {

                T.HowMany = T.HowMany - Num;

                return 1;

            }

            else

            {

                return 0;

            }

        }

    }

}

Web.config:

<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <appSettings>

    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />

  </appSettings>

  <system.web>

    <compilation debug="true" targetFramework="4.5" />

    <httpRuntime targetFramework="4.5"/>

  </system.web>

  <!--追加的代碼-->

  <system.serviceModel>

    <behaviors>

      <serviceBehaviors>

        <behavior>

          <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->

          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>

          <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->

          <serviceDebug includeExceptionDetailInFaults="false"/>

        </behavior>

      </serviceBehaviors>

    </behaviors>

    <protocolMapping>

        <add binding="basicHttpsBinding" scheme="https" />

    </protocolMapping>   

    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />

  </system.serviceModel>

  <system.webServer>

    <modules runAllManagedModulesForAllRequests="true"/>

    <!--

        若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。

        在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。

      -->

    <directoryBrowse enabled="false"/>

  </system.webServer>

</configuration>

2) WCF服务库项目的创建:


目录结构:


IService1.cs与Service1.cs文件的源码同上。

2.创建Asp.Net MVC 项目 调用WcfService:


目录结构:


1)添加服务引用:


右键引用->添加服务引用->发现(找到自己刚刚创建的WCF应用程序服务:WcfService)->选中->确认

再添加程序集 System.ServiceModel:

右键引用->添加引用->System.ServiceModel

TestController:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;

namespace WebApplication1.Controllers

{

    public class TestController : Controller

    {

        // GET: Test

        public ActionResult Index()

        {

            ServiceReference1.Service1Client TClient = new WebApplication1.ServiceReference1.Service1Client();

            int i = TClient.BuyTickets(1); //调用WCF中的方法

            if (i == 1)

            {

                //控制台输出

                System.Diagnostics.Debug.WriteLine("------------购买成功--------------\n"+"当前票数:"+TClient.GetRemainingNum());

            }

            return View();

        }

    }

}

运行效果:


3.创建WinForm窗体调用WcfService:


项目名:WindowsFormsClient

添加服务(程序集与WcfService):原理同上。

目录结构:


设计器的代码:

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Windows.Forms;

namespace WindowsFormsClient

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }

        ServiceReference1.Service1Client TClient = new WindowsFormsClient.ServiceReference1.Service1Client();

        //购买车票

        private void button1_Click(object sender, EventArgs e)

        {

            int i = TClient.BuyTickets(1); //调用WCF中的方法

            if (i == 1)

            {

                this.label1.Text = "购买成功";

            }

            this.label1.Text += "剩余车票还有" + TClient.GetRemainingNum().ToString();

        }

        //查询票数

        private void button2_Click(object sender, EventArgs e)

        {

            this.label1.Text = "";

            this.label1.Text = TClient.GetRemainingNum().ToString();//调用WCF中的方法

        }

    }

}

源码下载地址:https://download.csdn.net/download/laizhixue/10969849

---------------------

作者:laizhixue

来源:CSDN

原文:https://blog.csdn.net/laizhixue/article/details/87863873

版权声明:本文为博主原创文章,转载请附上博文链接!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,689评论 0 3
  • 目录本次给大家介绍的是我收集以及自己个人保存一些.NET面试题第二篇简介1.接口2.您在什么情况下会用到虚方法或抽...
    寒剑飘零阅读 1,960评论 0 10
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,307评论 0 9
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 3,277评论 0 19
  • bfc 是盒模型布局的css渲染模式。属于正常文档流。 首先BFC是一个名词,是一个独立的布局环境,我们可以理解为...
    debt阅读 367评论 0 0