向客户端脚本公开 WCF 服务

更新:2007 年 11 月

Windows Communication Foundation (WCF) 是 Microsoft 为生成面向服务的应用程序而提供的统一编程模型。它支持 ASP.NET AJAX 和 JavaScript Object Notation (JSON) 数据格式。该模型可使 WCF 服务向运行 ECMAScript (JavaScript) 代码并因此可以使用 HTTP 请求访问这些服务的网页公开功能。

如果已创建 WCF 服务,则可以通过添加终结点使支持 AJAX 的网页中的脚本访问这些服务。本主题介绍如何向浏览器中运行的 JavaScript 提供 WCF 服务。

加载页面时,.NET Framework 会自动为 WCF 服务创建 JavaScript 代理类并将代理类脚本下载到浏览器中。这些代理类派生自 Microsoft AJAX Library 中的 Sys.Net.WebServiceProxy 类。

通过调用 JavaScript 代理类的方法,可以调用相应的 WCF 服务操作。有关更多信息,请参见从客户端脚本调用 Web 服务

使 WCF 服务可从客户端脚本访问

若要使 WCF 服务可从客户端脚本进行访问,它必须满足下列要求:

  • 承载该服务的 Web 应用程序必须包含一个扩展名为 .svc 的文件。此文件包含指向 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 服务。有关更多信息,请参见如何:在 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

有关更多信息,请参见 Creating WCF Services for ASP.NET AJAX(为 ASP.NET AJAX 创建 WCF 服务)。

从 ASP.NET 网页的客户端脚本中使用 WCF 服务

若要从 ASP.NET 网页的客户端脚本中调用 WCF 服务,必须先向该页面中添加一个 ScriptManager 控件。随后应以声明方式设置 ServiceReference 对象,方法是向 ScriptManager 控件添加一个 asp:ServiceReference 子元素并将其 path 属性设置为指向 WCF 服务。下面的示例演示了一个服务引用。

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

ServiceReference 对象只能引用位于相同域中的 Web 服务。Web 服务路径可以是相对路径、应用程序相对路径、域相对路径或绝对路径。对于绝对路径,必须确保该路径位于相同域中。

当呈现包含此 ScriptManager 控件的页面时,它将为 WCF 服务创建 JavaScript 代理类。该代理类具有与每个服务操作相对应的功能。该页还包含 JavaScript 代理类,这些代理类对应于用作 Web 服务方法的输入参数或返回值的服务器数据类型。这使您可以编写用于初始化这些参数的客户端脚本,并可以将这些参数传递给方法调用。

请参见

概念

在 ASP.NET AJAX 中使用 Web 服务

从客户端脚本调用 Web 服务

其他资源

对 JSON 和其他数据传输格式的支持

如何:使用配置来添加 ASP.NET AJAX 终结点

为 ASP.NET AJAX 创建 WCF 服务

如何:创建支持 AJAX 的 WCF 服务和访问该服务的 ASP.NET 客户端