1.創(chuàng)建WCF服務(wù)項(xiàng)目:
闡述:WCF服務(wù)庫(kù)與WCF服務(wù)應(yīng)用程序的區(qū)別。
WCF服務(wù)庫(kù)趟紊,可以認(rèn)為是一個(gè)包含WCF服務(wù)以及契約定義的類(lèi)庫(kù)椒振。這兒庫(kù)還不能直接運(yùn)行,你可以在其他項(xiàng)目里引用布隔,在宿主里啟用托管這個(gè)庫(kù)离陶。
而WCF應(yīng)用程序,是一個(gè)可以執(zhí)行的程序执泰,它有獨(dú)立的進(jìn)程枕磁,WCF服務(wù)類(lèi)契約的定義,可以直接看到運(yùn)行的效果术吝。此項(xiàng)目模板應(yīng)該是基于IIS托管的程序计济。
前者一般考慮WCF服務(wù)設(shè)計(jì)的時(shí)候,服務(wù)類(lèi)的定義為單獨(dú)的庫(kù)排苍,可以為其它項(xiàng)目使用沦寂。提高代碼的復(fù)用性。
后者在開(kāi)發(fā)基于IIS托管的WCF服務(wù)程序時(shí)淘衙,比較多見(jiàn)传藏,自學(xué)的時(shí)候也可以使用這種類(lèi)型。
當(dāng)然你也可以修改這些代碼彤守,比如把WCF服務(wù)程序里的類(lèi)毯侦,移到一個(gè)單獨(dú)的類(lèi)庫(kù)里。
1) WCF服務(wù)應(yīng)用程序項(xiàng)目的創(chuàng)建:
WCF服務(wù)應(yīng)用程序的目錄結(jié)構(gòu):
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
{
? ? // 注意: 使用“重構(gòu)”菜單上的“重命名”命令具垫,可以同時(shí)更改代碼和配置文件中的接口名“IService1”侈离。
? ? [ServiceContract]
? ? public interface IService1
? ? {
? ? ? ? [OperationContract]
? ? ? ? /* 增加車(chē)票的方法*/
? ? ? ? void AddTicket(int count);
? ? ? ? [OperationContract]
? ? ? ? /*購(gòu)買(mǎi)車(chē)票的方法*/
? ? ? ? int BuyTickets(int Num);
? ? ? ? [OperationContract]? //服務(wù)契約? 即提供服務(wù)的實(shí)現(xiàn)方法
? ? ? ? /*查詢(xún)車(chē)票的方法*/
? ? ? ? int GetRemainingNum();
? ? ? ? // TODO: 在此添加您的服務(wù)操作
? ? }
? ? // 使用下面示例中說(shuō)明的數(shù)據(jù)約定將復(fù)合類(lèi)型添加到服務(wù)操作。
? ? //數(shù)據(jù)契約?
? ? [DataContract]?
? ? public class Ticket
? ? {
? ? ? ? bool boolCount =true;//判斷是否還有車(chē)票
? ? ? ? static int howmany = 10;//還有多少車(chē)票
? ? ? ? [DataMember]
? ? ? ? //判斷是否還有票
? ? ? ? public bool BoolCalue
? ? ? ? {
? ? ? ? ? ? get { return boolCount; }
? ? ? ? ? ? set
? ? ? ? ? ? {
? ? ? ? ? ? ? ? if (HowMany > 0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? boolCount = true;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? boolCount = false;
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? [DataMember]
? ? ? ? //返回票數(shù)
? ? ? ? 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
{
? ? // 注意: 使用“重構(gòu)”菜單上的“重命名”命令筝蚕,可以同時(shí)更改代碼卦碾、svc 和配置文件中的類(lèi)名“Service1”铺坞。
? ? // 注意: 為了啟動(dòng) WCF 測(cè)試客戶(hù)端以測(cè)試此服務(wù),請(qǐng)?jiān)诮鉀Q方案資源管理器中選擇 Service1.svc 或 Service1.svc.cs洲胖,然后開(kāi)始調(diào)試济榨。
? ? public class Service1 : IService1
? ? {
? ? ? ? Ticket T = null;
? ? ? ? public Service1() {
? ? ? ? ? ? T = new Ticket();
? ? ? ? }
? ? ? ? /*實(shí)現(xiàn)添加票數(shù)的方法*/
? ? ? ? public void AddTicket(int count)
? ? ? ? {
? ? ? ? ? ? T.HowMany = T.HowMany + count;
? ? ? ? }
? ? ? ? /*實(shí)現(xiàn)返回票數(shù)的方法*/
? ? ? ? public int GetRemainingNum()
? ? ? ? {
? ? ? ? ? ? return T.HowMany;
? ? ? ? }
? ? ? ? /*實(shí)現(xiàn)購(gòu)買(mǎi)車(chē)票的方法*/
? ? ? ? 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>
? ? ? ? ? <!-- 為避免泄漏元數(shù)據(jù)信息,請(qǐng)?jiān)诓渴鹎皩⒁韵轮翟O(shè)置為 false -->
? ? ? ? ? <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
? ? ? ? ? <!-- 要接收故障異常詳細(xì)信息以進(jìn)行調(diào)試绿映,請(qǐng)將以下值設(shè)置為 true擒滑。在部署前設(shè)置為 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"/>
? ? <!--
? ? ? ? 若要在調(diào)試過(guò)程中瀏覽 Web 應(yīng)用程序根目錄,請(qǐng)將下面的值設(shè)置為 True绘梦。
? ? ? ? 在部署之前將該值設(shè)置為 False 可避免泄露 Web 應(yīng)用程序文件夾信息橘忱。
? ? ? -->
? ? <directoryBrowse enabled="false"/>
? </system.webServer>
</configuration>
2) WCF服務(wù)庫(kù)項(xiàng)目的創(chuàng)建:
目錄結(jié)構(gòu):
IService1.cs與Service1.cs文件的源碼同上。
2.創(chuàng)建Asp.Net MVC 項(xiàng)目 調(diào)用WcfService:
目錄結(jié)構(gòu):
1)添加服務(wù)引用:
右鍵引用->添加服務(wù)引用->發(fā)現(xiàn)(找到自己剛剛創(chuàng)建的WCF應(yīng)用程序服務(wù):WcfService)->選中->確認(rèn)
再添加程序集 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); //調(diào)用WCF中的方法
? ? ? ? ? ? if (i == 1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? //控制臺(tái)輸出
? ? ? ? ? ? ? ? System.Diagnostics.Debug.WriteLine("------------購(gòu)買(mǎi)成功--------------\n"+"當(dāng)前票數(shù):"+TClient.GetRemainingNum());
? ? ? ? ? ? }
? ? ? ? ? ? return View();
? ? ? ? }
? ? }
}
運(yùn)行效果:
3.創(chuàng)建WinForm窗體調(diào)用WcfService:
項(xiàng)目名:WindowsFormsClient
添加服務(wù)(程序集與WcfService):原理同上卸奉。
目錄結(jié)構(gòu):
設(shè)計(jì)器的代碼:
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();
? ? ? ? //購(gòu)買(mǎi)車(chē)票
? ? ? ? private void button1_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? int i = TClient.BuyTickets(1); //調(diào)用WCF中的方法
? ? ? ? ? ? if (i == 1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ? this.label1.Text = "購(gòu)買(mǎi)成功";
? ? ? ? ? ? }
? ? ? ? ? ? this.label1.Text += "剩余車(chē)票還有" + TClient.GetRemainingNum().ToString();
? ? ? ? }
? ? ? ? //查詢(xún)票數(shù)
? ? ? ? private void button2_Click(object sender, EventArgs e)
? ? ? ? {
? ? ? ? ? ? this.label1.Text = "";
? ? ? ? ? ? this.label1.Text = TClient.GetRemainingNum().ToString();//調(diào)用WCF中的方法
? ? ? ? }
? ? }
}
源碼下載地址:https://download.csdn.net/download/laizhixue/10969849
---------------------
作者:laizhixue
來(lái)源:CSDN
原文:https://blog.csdn.net/laizhixue/article/details/87863873
版權(quán)聲明:本文為博主原創(chuàng)文章钝诚,轉(zhuǎn)載請(qǐng)附上博文鏈接!