多看多練,慢慢入門。今天将學習的wcf中實作重載進行梳理一遍。直接上代碼和注意事項吧,多的我也解釋不清,去看大佬的部落格。他們說的更詳細。
最簡單的三層結構,Client用直接服務引用的方法實作,ClientByConfig用重寫服務端+配置檔案的方法實作的。

服務端代碼:
就是普通的服務接口,裡面兩個名字相同的方法,然後用在上面加特性用于區分兩個方法。
[ServiceContract]
public interface IService1
{
[OperationContract(Name="AddInt")]
int Add(int num1, int num2);
[OperationContract(Name="AddDouble")]
double Add(double num1, double num2);
// TODO: 在此添加您的服務操作
}
服務實作:
public class Service1 : IService1
{
public int Add(int num1, int num2)
{
return num1 + num2;
}
public double Add(double num1, double num2)
{
return num2 + num1;
}
}
寄宿代碼和配置檔案
static void Main(string[] args)
{
using (ServiceHost host = new ServiceHost(typeof(Service1)))
{
host.Opened += delegate
{
Console.WriteLine("CalculatorService已經啟動!");
};
//通訊狀态轉換到已打開
host.Open();
Console.ReadLine();
}
}
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服務庫項目時,必須将配置檔案的内容添加到
主機的 app.config 檔案中。System.Configuration 不支援庫的配置檔案。 -->
<system.serviceModel>
<services>
<service name="Service.Service1" behaviorConfiguration="Service.Service1Behavior">
<host>
<baseAddresses>
<add baseAddress = "http://localhost:8733/Design_Time_Addresses/Service/Service1/" />
</baseAddresses>
</host>
<!-- Service Endpoints -->
<!-- 除非完全限定,否則位址相對于上面提供的基址-->
<endpoint address="http://192.168.10.2:8733/Design_Time_Addresses/Service/Service1/" binding="basicHttpBinding" contract="Service.IService1">
<!--
部署時,應删除或替換以下辨別元素,以反映
在其下運作部署服務的辨別。删除之後,WCF 将
自動推導相應辨別。
-->
<identity>
<dns value="localhost"/>
</identity>
</endpoint>
<!-- Metadata Endpoints -->
<!-- 中繼資料交換終結點供相應的服務用于向用戶端做自我介紹。 -->
<!-- 此終結點不使用安全綁定,應在部署前確定其安全或将其删除 -->
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="Service.Service1Behavior">
<!-- 為避免洩漏中繼資料資訊,
請在部署前将以下值設定為 false -->
<serviceMetadata httpGetEnabled="True"/>
<!-- 要接收故障異常詳細資訊以進行調試,
請将以下值設定為 true。在部署前
設定為 false 可避免洩漏異常資訊 -->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
服務端就這些東西,跟平時用的都差不多,就是多了個特性,用來區分兩個方法。下面介紹用戶端的兩種實作方法。
第一種:
直接應用,就是直接服務啟動以後,直接添加服務引用,這樣生成以後可以更直覺的看到裡面的内容區分。
直接引用會自動生成一個配置檔案 ,這個就不貼出來了。
自己點開看看,差別在哪裡。 這兩個其實就是你前面寫的特性的名字,用戶端引用以後被重寫了。
控制台代碼:
static void Main(string[] args)
{
Service1Client service = new Service1Client();
Console.WriteLine("結果:{0}",service.AddInt(12, 12));
Console.Read();
}
第一種方法就結束了,可以很清楚的看到,類似于把服務端的方法進行了重寫。重寫的方法名就是特性上面的名稱。
第二種:
第二種其實更簡單,或者說更符合C#的那種。類似于把服務端重寫一遍,但是有區分,新手一定要注意。這個名字的指向還是服務端的名稱。這個接口重新起個名字。
服務實作:
public class MyServiceClient : ClientBase<ImyService>, ImyService
{
public int Add(int num1, int num2)
{
return Channel.Add(num1, num2);
}
public double Add(double num1, double num2)
{
return Channel.Add(num1, num2);
}
}
建立用戶端配置檔案:
我不是建立的,我是把上個方法自動生成的拷貝過來的,然後有個地方要進行修改。這個一定要對應為用戶端的服務,不然會報錯。
控制台代碼:
static void Main(string[] args)
{
MyServiceClient serviceClient = new MyServiceClient();
Console.WriteLine("結果:{0}", serviceClient.Add(12,12));
Console.Read();
}
這就結束了。得到的結果其實是一樣的,第二種方法貌似更符合以前的那種方式,因為方法的名字并沒有被修改,隻要傳入不同的參數就能識别。建議使用第二種。源代碼,自己寫的也是為了掙點積分,以後學習别人的能用的,有大佬的話,送點積分,哈哈。