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

15 篇文章 0 订阅
2 篇文章 0 订阅

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

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

laizhixue

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值