Поделиться через


Предоставление доступа к службам WCF в клиентском сценарии

Обновлен: Ноябрь 2007

Windows Communication Foundation (WCF) — это универсальная модель программирования Microsoft для построения сервисноориентированных приложений. Она поддерживает AJAX ASP.NET и формат данных JSON. Модель позволяет службам WCF предоставлять функциональные возможности для веб-страниц, которые выполняют код ECMAScript (JavaScript) и, таким образом, могут обращаться к этим службам с помощью HTTP-запросов. 

Если службы WCF уже созданы, можно добавить конечные точки, позволяющие сценарию на веб-страницах с включенным AJAX получить доступ к этим службам. В этом разделе описывается создание службы WCF, доступной для JavaScript, который запускается в обозревателе.

.NET Framework автоматически создает прокси-классы JavaScript для служб WCF во время загрузки страницы и загружает сценарий прокси-класса в обозревателе. Эти прокси-классы являются производными от класса Sys.Net.WebServiceProxy в Microsoft AJAX (библиотека). 

Можно вызвать операцию службы WCF, вызвав соответствующий метод прокси-класса JavaScript. Дополнительные сведения см. в разделе Вызов веб-служб из клиентского сценария.

Создание службы WCF, доступной из клиентского сценария

Чтобы служба WCF была доступна из клиентского сценария, она должен удовлетворять следующим требованиям:

  • Служба должна размещаться в веб-приложении, содержащем файл с расширением SVC. Этот файл содержит директиву @ ServiceHost, которая указывает на службу WCF. В следующем примере иллюстрируется директива @ 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"%> 
    
  • Необходимо настроить веб-приложение для поддержки вызова веб-служб из сценария. Дополнительные сведения см. в разделе Практическое руководство. Настройка служб WCF в ASP.NET AJAX.

  • Служба должна быть классом, реализующим интерфейс, помеченный 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

Дополнительные сведения см. в документе Создание служб WCF для ASP.NET AJAX (на английском языке).

Использование службы WCF из клиентского сценария на веб-странице ASP.NET

Для вызова службы WCF из клиентского сценария на веб-странице ASP.NET необходимо сначала добавить элемент управления ScriptManager на страницу. Декларативно задайте объект ServiceReference, добавив дочерний элемента asp:ServiceReference к элементу управления ScriptManager и настроев его атрибут path таким образом, чтобы он указывал на службу WCF. В следующем примере проиллюстрирована ссылка на службу.

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

Объект ServiceReference может ссылаться на веб-службу только в том же домене. Путь веб-службы может быть относительным, относительным к приложению, относительным к домену или абсолютным. При использовании абсолютного пути следует убедиться, что он указан в том же домене.

При отображении страницы, содержащей этот элемент управления ScriptManager, для службы WCF создается прокси-класс JavaScript. Прокси-класс содержит функции, соответствующие каждой операции службы. Страница также содержит прокси-классы JavaScript, соответствующие типам данных сервера, которые используются в качестве входных параметров или возвращаемых значений методов веб-служб. Это позволяет написать клиентский сценарий, инициализирующий эти параметры, и передать их вызову метода.

См. также

Основные понятия

Использование веб-служб в технологии AJAX ASP.NET

Вызов веб-служб из клиентского сценария

Другие ресурсы

Support for JSON and Other Data Transfer Formats

How to: Use Configuration to Add an ASP.NET AJAX Endpoint

Creating WCF Services for ASP.NET AJAX

How to: Create an AJAX-Enabled WCF Service and an ASP.NET Client that Accesses the Service