天天看點

WCF入門-兩種方法實作重載

多看多練,慢慢入門。今天将學習的wcf中實作重載進行梳理一遍。直接上代碼和注意事項吧,多的我也解釋不清,去看大佬的部落格。他們說的更詳細。

最簡單的三層結構,Client用直接服務引用的方法實作,ClientByConfig用重寫服務端+配置檔案的方法實作的。

WCF入門-兩種方法實作重載

 服務端代碼:

就是普通的服務接口,裡面兩個名字相同的方法,然後用在上面加特性用于區分兩個方法。

[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>
           

服務端就這些東西,跟平時用的都差不多,就是多了個特性,用來區分兩個方法。下面介紹用戶端的兩種實作方法。

第一種:

直接應用,就是直接服務啟動以後,直接添加服務引用,這樣生成以後可以更直覺的看到裡面的内容區分。

WCF入門-兩種方法實作重載

直接引用會自動生成一個配置檔案 ,這個就不貼出來了。

WCF入門-兩種方法實作重載

自己點開看看,差別在哪裡。 這兩個其實就是你前面寫的特性的名字,用戶端引用以後被重寫了。

WCF入門-兩種方法實作重載

控制台代碼:

static void Main(string[] args)
        {
            Service1Client service = new Service1Client();
            Console.WriteLine("結果:{0}",service.AddInt(12, 12));
            Console.Read();
        }
           

第一種方法就結束了,可以很清楚的看到,類似于把服務端的方法進行了重寫。重寫的方法名就是特性上面的名稱。 

第二種:

第二種其實更簡單,或者說更符合C#的那種。類似于把服務端重寫一遍,但是有區分,新手一定要注意。這個名字的指向還是服務端的名稱。這個接口重新起個名字。

WCF入門-兩種方法實作重載

服務實作:

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);
        }
    }
           

建立用戶端配置檔案:

我不是建立的,我是把上個方法自動生成的拷貝過來的,然後有個地方要進行修改。這個一定要對應為用戶端的服務,不然會報錯。

WCF入門-兩種方法實作重載

控制台代碼:

static void Main(string[] args)
        {
            MyServiceClient serviceClient = new MyServiceClient();
            Console.WriteLine("結果:{0}", serviceClient.Add(12,12));
            Console.Read();
        }
           

這就結束了。得到的結果其實是一樣的,第二種方法貌似更符合以前的那種方式,因為方法的名字并沒有被修改,隻要傳入不同的參數就能識别。建議使用第二種。源代碼,自己寫的也是為了掙點積分,以後學習别人的能用的,有大佬的話,送點積分,哈哈。