共用方式為


將 WCF 服務公開給用戶端指令碼

更新:2007 年 11 月

Windows Communication Foundation (WCF) 是 Microsoft 建置服務導向應用程式的統一程式撰寫模型 (Programming Model)。它支援 ASP.NET AJAX 和 JavaScript 物件標記法 (JSON) 資料格式。此模型可讓 WCF 服務向執行 ECMAScript (JavaScript) 程式碼的 Web 網頁公開功能,因此可使用 HTTP 要求來存取這些服務。 

如果您已經建立 WCF 服務,可以加入端點,讓具備 AJAX 技術之 Web 網頁中的指令碼可以存取這些服務。本主題說明如何使瀏覽器上執行的 JavaScript 可以使用 WCF 服務。

.NET Framework 會在頁面載入階段自動建立 WCF 服務的 JavaScript Proxy 類別,並將 Proxy 類別指令碼下載至瀏覽器中。這些 Proxy 類別是衍生自 Microsoft AJAX Library 中的 Sys.Net.WebServiceProxy 類別。 

您可以呼叫 JavaScript Proxy 類別的對應方法,藉此呼叫 WCF 服務作業。如需詳細資訊,請參閱從用戶端指令碼呼叫 Web 服務

使 WCF 服務可透過用戶端指令碼存取

若要使 WCF 服務可透過用戶端指令碼存取,必須滿足下列需求:

  • 服務必須由包含 .svc 副檔名之檔案的 Web 應用程式所裝載。此檔案包含指向 WCF 服務的 @ ServiceHost 指示詞。下列範例說明 @ ServiceHost 指示詞。

    <%@ ServiceHost Language=C# Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.cs"%> 
    
    <%@ ServiceHost Language=VB Service="Aspnet.Samples.SimpleService" CodeBehind="~/App_Code/SimpleService.vb"%> 
    
  • 您必須設定 Web 應用程式,以支援透過指令碼呼叫 Web 服務。如需詳細資訊,請參閱 HOW TO:設定 ASP.NET AJAX 中的 WCF 服務

  • 此服務必須是可實作介面 (以 ServiceContractAttribute 標記) 的類別。要透過指令碼呼叫的個別服務作業 (方法),必須以 OperationContractAttribute 屬性限定。

下列範例說明可實作介面 (以 ServiceContractAttribute 標記) 的類別。

namespace Samples.Aspnet
{
    [ServiceContract(Namespace="MyServices.org")]
    public interface ISimpleService
    {
        [OperationContract]
        string HelloWorld1(string value1);
        [OperationContract]
        string HelloWorld2(DataContractType dataContractValue1);
    }

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class SimpleService : ISimpleService
    {
        public SimpleService()
        { }

        public string HelloWorld1(string value1)
        {
            return "Hello " + value1;
        }
        public string HelloWorld2(DataContractType dataContractValue1)
        {
            return "Hello " + dataContractValue1.FirstName +
                                " " + dataContractValue1.LastName;
        }
    }

    [DataContract]
    public class DataContractType
    {
        string firstName;
        string lastName;

        [DataMember]
        public string FirstName
        {
            get { return firstName; }
            set { firstName = value; }
        }
        [DataMember]
        public string LastName
        {
            get { return lastName; }
            set { lastName = value; }
        }
    }
Namespace Aspnet.Samples.SimpleService

    <ServiceContract(NameSpace="MyServices.org")> _
    Public Interface ISimpleService
        <OperationContract()> _
        Function HelloWorld1(ByVal value1 As String) As String
        <OperationContract()> _
        Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String
    End Interface 'ISimpleService

    <ServiceBehavior(IncludeExceptionDetailInFaults:=True), _
    AspNetCompatibilityRequirements(RequirementsMode:= _
    AspNetCompatibilityRequirementsMode.Allowed)> _
    Public Class SimpleService
        Implements ISimpleService

        Public Sub New()

        End Sub 'New

        Public Function HelloWorld1(ByVal value1 As String) As String _
        Implements ISimpleService.HelloWorld1
            Return "Hello " + value1
        End Function 'HelloWorld1

        Public Function HelloWorld2(ByVal dataContractValue1 _
        As DataContractType) As String _
        Implements ISimpleService.HelloWorld2
            Return "Hello " + dataContractValue1.FirstName + " " + _
            dataContractValue1.LastName
        End Function 'HelloWorld2
    End Class 'SimpleService

    <DataContract()> _
    Public Class DataContractType
        Private _firstName As String
        Private _lastName As String


        <DataMember()> _
        Public Property FirstName() As String
            Get
                Return _firstName
            End Get
            Set(ByVal value As String)
                _firstName = value
            End Set
        End Property

        <DataMember()> _
        Public Property LastName() As String
            Get
                Return _lastName
            End Get
            Set(ByVal value As String)
                _lastName = value
            End Set
        End Property
    End Class 'DataContractType 
End Namespace

如需詳細資訊,請參閱建立 ASP.NET AJAX 的 WCF 服務

在 ASP.NET 網頁中透過用戶端指令碼使用 WCF 服務

若要在 ASP.NET 網頁中透過用戶端指令碼呼叫 WCF 服務,請先將 ScriptManager 控制項加入至網頁。接著,將 asp:ServiceReference 子項目加入至 ScriptManager 控制項,並設定其 path 屬性,以便指向 WCF 服務,藉此以宣告方式設定 ServiceReference 物件。下列範例說明服務參考。

<asp:ScriptManager ID="ScriptManager1" >
  <Services>
    <asp:ServiceReference 
      Path="http://<serverhost>/SimpleService.svc"/>
  </Services>
</asp:ScriptManager>

ServiceReference 物件在同一個網域中只能參考一個 Web 服務。Web 服務路徑可以是相對路徑、相對應用程式路徑、相對網域路徑或絕對路徑。如果是絕對路徑,您必須確定路徑在同一個網域中。

當內含這個 ScriptManager 控制項的頁面呈現時,頁面會為 WCF 服務建立 JavaScript Proxy 類別。Proxy 類別具有能對應至每個服務作業的功能。這個頁面也包含 JavaScript Proxy 類別,所對應的伺服器資料型別是做為 Web 服務方法的輸入參數或傳回值。這可讓您撰寫用戶端指令碼,以初始化這些參數並將參數傳遞給方法呼叫。

請參閱

概念

在 ASP.NET AJAX 中使用 Web 服務

從用戶端指令碼呼叫 Web 服務

其他資源

JSON 和其他資料傳輸格式的支援

HOW TO:使用組態新增 ASP.NET AJAX 端點

建立 ASP.NET AJAX 的 WCF 服務

HOW TO:建立啟用 AJAX 的 WCF 服務和存取該服務的 ASP.NET 用戶端