程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> WCF學習(二):服務契約

WCF學習(二):服務契約

編輯:關於.NET

一、服務契約介紹

我個人理解服務契約是一組公開的操作,其中公開的操作(OperationContract)只能定義在方法(Method)上。對於我們要公開的服務我們可以在接口或者類上加上標識ServiceContract。但是我們一般情況下,會把ServiceContract定義在接口上而不是類上,這樣有幾個好處:

1.方便契約的繼承,不同的類型可以去實現相同的契約,重用性高。

2.同一服務可以去實現多個契約。

3.可以隨時去修改服務類型,而不需去修改接口。

下面定義一個服務的契約:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
  
namespace Service
{
  [ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
  public interface ICalucator
  {
    [OperationContract]
    int Add(int x, int y);
  
  }
}

我們在上面首先定義了一個接口名稱為:ICalucator,然後我們要將這個接口公開為服務契約在上面加上屬性標識[ServiceContract],其中Name可以為契約指定別名,這樣的話,如果我們在客戶端遇到相同的接口時可以通過Name來制定別名區別開來。公開的操作為Add方法,在上面標識[OperationContract]即可。

二、方法的重載

按照我們正常的方法去重載的話,只需要方法的參數不同(個數、類型)就可以實現方法的重載。但是我們在服務契約的定義的時候是不能怎樣的,wdsl是編譯同不過的如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
  
namespace Service
{
  [ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
  public interface ICalucator
  {
    [OperationContract]
    int Add(int x, int y);
  
    [OperationContract]
    double Add(double x, double y);
  }
}

上面的方法是編譯不能通過的。但是我們有一種解決的辦法可以去解決這樣的問題,就是通過OperationContract的Name屬性來設定方法的別名是實現方法的重載。如:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
  
namespace Service
{
  [ServiceContract(Name="Service_Calucator",Namespace="Henllyee")]
  public interface ICalucator
  {
    [OperationContract(Name="IntAdd")]
    int Add(int x, int y);
  
    [OperationContract(Name="DoubleAdd")]
    double Add(double x, double y);
  }
}

下面我們通過數據元的方式來配置一個宿主主機,我們添加一個控制台的程序,通過配置App.Config來實現。

在App.Config中:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
 <system.serviceModel>
  <services>
   <service name="Service.Calucator" behaviorConfiguration="mex">
    <host>
     <baseAddresses>
      <add baseAddress="http://localhost:8888"/>
     </baseAddresses>
    </host>
    <endpoint address="Calucator" binding="basicHttpBinding" contract="Service.ICalucator"></endpoint>
   </service>
  </services>
  <behaviors>
   <serviceBehaviors>
    <behavior name="mex">
     <serviceMetadata httpGetEnabled="true"/>
    </behavior>
   </serviceBehaviors>
  </behaviors>
 </system.serviceModel>
</configuration>

在主程序中:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using Service;
  
namespace Host
{
  class Program
  {
    static void Main(string[] args)
    {
      ServiceHost host = null;
      try
      {
        host = new ServiceHost(typeof(Calucator));
        host.Open();
  
        Console.Write("Host is opening now! Press any key to stop");
        Console.Read();
      }
      finally
      {
        host.Close();
      }
    }
  }
}

然後我們啟動主機,在浏覽器中輸入地址:http://localhost:8888/?wsdl 。我們可以看到:

我們可以看到wsdl編譯時已經將名稱編譯成為了我們Name中定義的別名。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved