將 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 服務方法的輸入參數或傳回值。這可讓您撰寫用戶端指令碼,以初始化這些參數並將參數傳遞給方法呼叫。