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

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

В этом разделе описаны способы доступа к веб-службам с помощью клиентского сценария на веб-страницах ASP.NET, поддерживающих технологию AJAX. Этими службами могут быть создаваемые пользователем службы или встроенные службы приложения. Службы приложения предоставляются как часть технологии AJAX в ASP.NET и включают службу проверки подлинности, ролей и профилей.

К пользовательским веб-службам относятся веб-службы ASP.NET (службы ASMX) и службы Windows Communication Foundation (WCF) (службы SVC).

В этом разделе содержатся следующие подразделы:

  • Варианты использования

  • Базовые сведения

  • Примеры

  • Дополнительные ресурсы

  • Ссылка на классы

  • Новые возможности

Варианты использования

WCF и ASP.NET используются в следующих случаях:

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

  • Если веб-службы ASP.NET (ASMX-файлы) уже созданы, то их можно изменить, чтобы сценарий веб-страниц с поддержкой технологии AJAX мог получить доступ к этим же службам. Дополнительные сведения см. в разделе Предоставление доступа к веб-службам в клиентском сценарии.

  • Если необходимо создать пользовательскую веб-службу, к которой можно обращаться с веб-страниц ASP.NET с поддержкой технологии AJAX, можно реализовать ее как службу WCF или веб-службу ASP.NET (ASMX-файл).

  • Можно использовать встроенные службы приложения ASP.NET для доступа к сведениям о проверке подлинности, ролях и профилях пользователей из клиентского сценария, который выполняется на веб-странице с поддержкой технологии AJAX. Дополнительные сведения см. в разделе Использование проверки подлинности с помощью форм в ASP.NET AJAX.

Базовые сведения

ASP.NET позволяет создавать веб-службы, к которым можно обращаться из клиентского сценария веб-страниц. Страницы взаимодействуют с сервером посредством уровня связи, использующего технологию AJAX для вызова веб-служб. Обмен данными между клиентом и сервером осуществляется асинхронно, как правило, в формате JSON.

Взаимодействие клиент – сервер для клиентов AJAX

На веб-страницах с поддержкой технологии AJAX обозреватель отправляет первый запрос этой страницы на сервер, а затем выполняет последовательные асинхронные запросы данных к веб-службам. Клиентские элементы взаимодействия представлены в форме загруженных с сервера прокси-классов и основной библиотеки клиентских сценариев. К серверным элементам взаимодействия относятся обработчики и пользовательские службы. На следующей иллюстрации показаны элементы, которые участвуют во взаимодействии между клиентом и сервером:

Взаимодействие клиент-сервер
Клиентская серверная связь веб-служб в AJAX

Клиентская архитектура технологии AJAX

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

Чтобы вызвать метод веб-службы, клиентский сценарий вызывает соответствующие методы прокси-класса. Эти вызовы выполняются асинхронно посредством объекта XMLHTTP.

Уровень связи веб-служб содержит библиотечные типы сценариев, которые включают прокси-классы для вызова служб. Дополнительные сведения см. в описании классов, содержащихся в пространстве имен Sys.Net.

Код в прокси-классах и основном уровне связи веб-служб скрывает сложность XMLHTTP и различия между обозревателями. Он упрощает клиентский сценарий, необходимый для вызова веб-службы.

Существует два подхода к вызовам веб-служб.

  • Вызов веб-служб с помощью команды POST HTTP. POST-запрос состоит из основной части, содержащей данные, которые обозреватель отправляет на сервер. Этот запрос не имеет ограничений по размеру. Поэтому можно использовать POST-запрос, если размер данных превышает внутреннее ограничение по размеру для запроса GET. Клиент сериализует запрос в формат JSON и отправляет его на сервер в качестве данных POST. Сервер выполняет десериализацию данных из формата JSON в типы .NET Framework и выполняет фактический вызов службы. Во время ответа сервер сериализует возвращаемые значения и передает их обратно клиенту, который выполняет их десериализацию в объекты JavaScript для обработки.

  • Вызов веб-служб с помощью команды GET HTTP. Этот вызов аналогичен POST-запросу, однако существует несколько отличий:

    • Клиент использует строку запроса для отправки параметров на сервер.

    • GET-запрос может вызвать только метод веб-службы, настроенный с помощью атрибута ScriptMethodAttribute.

    • Размер данных ограничивается длиной URL-адреса, разрешенной веб-обозревателем.

      Bb515101.alert_note(ru-ru,VS.90).gifПримечание.

      Не рекомендуется использовать GET-запросы для вызовов методов, которые изменяют данные на сервере или предоставляют важные сведения. В GET-запросах сообщение кодируется веб-обозревателем в URL-адрес и поэтому является легкой мишенью для фальсификации. Как при использовании команды GET, так и при использовании команды POST для защиты конфиденциальных данных необходимо придерживаться рекомендаций по безопасности.

На следующей иллюстрации показана клиентская архитектура технологии AJAX в ASP.NET:

Клиентская архитектура AJAX
Клиентская архитектура веб-служб в AJAX

К элементам клиентской архитектуры относятся уровень связи веб-служб в основной библиотеке и загруженные прокси-классы для используемых на странице служб. На рисунке показаны следующие отдельные элементы:

  • Прокси-классы пользовательских служб. Они состоят из клиентского сценария, автоматически создаваемого сервером и загружаемого в веб-обозреватель. Прокси-классы предоставляют объект для каждой службы WCF или ASMX, используемой на странице. (Другими словами, они предоставляют объект для каждого элемента в элементе ServiceReferences элемента управления ScriptManager на странице.) При вызове прокси-метода в клиентском сценарии создается асинхронный запрос к соответствующему методу веб-службы на сервере.

  • Прокси-класс проверки подлинности. Прокси-класс AuthenticationService создается серверной службой проверки подлинности приложения. Он позволяет пользователю осуществлять вход и выход из системы с помощью JavaScript в обозревателе без необходимости совершения «кругового пути» на сервер.

  • Прокси-класс ролей. Прокси-класс RoleService создается серверной службой ролей приложения. Он позволяет объединять пользователей в группы и обрабатывать группу как единый блок с помощью JavaScript без необходимости совершать «круговой путь» на сервер. Этот класс можно использовать для предоставления или запрещения доступа к ресурсам на сервере.

  • Прокси-класс профиля. Класс ProfileService создается серверной службой профилей приложения. Он предоставляет доступ к сведениям о профиле текущего пользователя для клиента с помощью JavaScript без необходимости совершать «круговой путь» на сервер.

  • Прокси-класс методов страниц. Этот класс предоставляет инфраструктуру для клиентского сценария, чтобы вызывать статические методы страницы ASP.NET так, как если бы они были методами веб-служб. Дополнительные сведения см. в разделе Вызов веб-служб из клиентского сценария.

  • Уровень связи веб-служб. Этот уровень представляет собой библиотеку типов клиентского сценария. Эти типы позволяют обозревателю (клиенту) взаимодействовать со службами на сервере. Они также освобождают клиентские приложения от необходимости установки и поддержания асинхронной связи между клиентом и сервером. Они инкапсулируют объект XMLHTTP обозревателя, который предоставляет возможность асинхронного взаимодействия, и предоставляют клиентским приложениям независимость от веб-обозревателя. Ниже приведены основные элементы уровня связи веб-служб:

    • WebRequest. Предоставляет функциональные возможности клиентского сценария для создания веб-запроса. Дополнительные сведения см. в описании класса WebRequest.

    • WebRequestManager. Управляет потоком веб-запросов, направленных объектом Sys.Net.WebRequest соответствующему объекту-исполнителю. Дополнительные сведения см. в описании класса WebRequestManager.

    • XmlHttpExecutor. Выполняет асинхронные сетевые запросы, используя поддержку XMLHTTP веб-обозревателем. Дополнительные сведения см. в описании класса XmlHttpExecutor.

    • JSON-сериализация. Выполняет сериализацию объектов JavaScript в формат JSON. Десериализацию можно выполнить с помощью функции eval JavaScript. Дополнительные сведения см. в описании класса JavaScriptSerializer.

По умолчанию сериализация выполняется в формат JSON, однако отдельные методы веб-служб и веб-страниц ASP.NET могут возвращать значения в других форматах, например XML. Формат сериализации, используемый методом, можно указать с помощью атрибутов. Например, для службы ASMX можно задать атрибут ScriptMethodAttribute, предписывающий методу веб-службы возвращать данные в формате XML, как показано в следующем примере:

[ScriptMethod(ResponseFormat.Xml)] 

<ScriptMethod(ResponseFormat.Xml)> 

Серверная архитектура AJAX

На следующей иллюстрации показана серверная архитектура AJAX, включающая элементы, обеспечивающие взаимодействие с клиентскими приложениями:

Серверная архитектура AJAX
Серверная архитектура веб-служб в AJAX

Элементы серверной архитектуры включают уровень связи веб-служб, обработчик HTTP-данных и классы сериализации, пользовательские службы, методы страниц и службы приложений. На рисунке показаны следующие отдельные элементы:

  • Пользовательские веб-службы. Предоставляют функциональную возможность службы, реализуемую пользователями, и возвращают соответствующий ответ клиентскому приложению. Пользовательскими веб-службами могут быть службы ASP.NET или WCF. Уровень связи веб-служб автоматически создает прокси-классы клиентского сценария, которые могут быть вызваны асинхронно из клиентского сценария.

  • Методы страниц. Этот компонент позволяет вызывать метод страницы ASP.NET так, как если бы он был методом веб-службы. Методы страниц должны быть определены на странице, с которой осуществляется вызов метода страницы.

  • Служба проверки подлинности. Служба проверки подлинности создает прокси-класс проверки подлинности, который позволяет пользователю осуществлять вход и выход из системы с помощью клиентского сценария JavaScript. Эта служба приложения всегда доступна, поэтому нет необходимости создавать ее экземпляры. Дополнительные сведения см. в разделе Использование проверки подлинности с помощью форм в ASP.NET AJAX.

  • Служба ролей. Служба ролей создает прокси-класс ролей, который позволяет осуществлять доступ из клиентского сценария JavaScript к сведениям о ролях для текущего пользователя, прошедшего проверку подлинности. Эта служба приложения всегда доступна, поэтому нет необходимости создавать ее экземпляры. Дополнительные сведения см. в разделе Использование информации ролей с помощью ASP.NET AJAX.

  • Служба профилей. Служба профилей создает прокси-класс профилей, который позволяет клиентскому сценарию JavaScript получать и задавать свойства для пользователя, связанного с текущим запросом. Эта служба приложения всегда доступна, поэтому нет необходимости создавать ее экземпляры. Дополнительные сведения см. в разделе Использование сведений о профиле с ASP.NET AJAX.

  • JSON-сериализация. Серверный компонент JSON-сериализации позволяет выполнять настраиваемую сериализацию и десериализацию общих типов .NET Framework в формат JSON и из него. Дополнительные сведения см. в разделе JavaScriptSerializer.

  • XML-сериализация. Уровень связи веб-служб поддерживает XML-сериализацию для SOAP-запросов к веб-службам и возвращения типов XML по JSON-запросам к веб-службам.

Примеры

В следующих примерах показаны способы вызова служб ASP.NET и WCF из клиентского сценария. Примеры вызовов служб приложения из клиентского сценария приводятся в других разделах документации. Далее в этом разделе приводятся ссылки на соответствующие разделы.

Вызов методов веб-служб в AJAX

.NET Framework позволяет асинхронно вызывать методы веб-служб ASP.NET (ASMX) из обозревателя с помощью клиентского сценария. Страница может вызывать серверные методы без обратной передачи и необходимости обновления всей страницы, поскольку происходит обмен данными только между обозревателем и сервером.

В следующем примере показаны способы предоставления метода веб-службы на веб-странице ASP.NET:

<%@ Page Language="VB" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

    <head id="Head1" runat="server">
        <style type="text/css">
            body {  font: 11pt Trebuchet MS;
                    font-color: #000000;
                    padding-top: 72px;
                    text-align: center }

            .text { font: 8pt Trebuchet MS }
        </style>

        <title>Simple Web Service</title>

            <script type="text/javascript">

            // This function calls the Web Service method.  
            function GetServerTime()
            {
                Samples.AspNet.ServerTime.GetServerTime(OnSucceeded);
            }

            // This is the callback function that
            // processes the Web Service return value.
            function OnSucceeded(result)
            {
                var RsltElem = document.getElementById("Results");
                RsltElem.innerHTML = result;
            }

        </script>

    </head>

    <body>
        <form id="Form1" runat="server">
         <asp:ScriptManager runat="server" ID="scriptManager">
                <Services>
                    <asp:ServiceReference path="ServerTime.asmx" />
                </Services>
            </asp:ScriptManager>
            <div>
                <h2>Server Time</h2>
                    <p>Calling a service that returns the current server time.</p>

                    <input id="EchoButton" type="button" 
                        value="GetTime" onclick="GetServerTime()" />
            </div>
        </form>

        <hr/>

        <div>
            <span id="Results"></span>
        </div>   

    </body>

</html>
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

    <head id="Head1" runat="server">
        <style type="text/css">
            body {  font: 11pt Trebuchet MS;
                    font-color: #000000;
                    padding-top: 72px;
                    text-align: center }

            .text { font: 8pt Trebuchet MS }
        </style>

        <title>Simple Web Service</title>

            <script type="text/javascript">

            // This function calls the Web Service method.  
            function GetServerTime()
            {
                Samples.AspNet.ServerTime.GetServerTime(OnSucceeded);
            }

            // This is the callback function that
            // processes the Web Service return value.
            function OnSucceeded(result)
            {
                var RsltElem = document.getElementById("Results");
                RsltElem.innerHTML = result;
            }

        </script>

    </head>

    <body>
        <form id="Form1" runat="server">
         <asp:ScriptManager runat="server" ID="scriptManager">
                <Services>
                    <asp:ServiceReference path="ServerTime.asmx" />
                </Services>
            </asp:ScriptManager>
            <div>
                <h2>Server Time</h2>
                    <p>Calling a service that returns the current server time.</p>

                    <input id="EchoButton" type="button" 
                        value="GetTime" onclick="GetServerTime()" />
            </div>
        </form>

        <hr/>

        <div>
            <span id="Results"></span>
        </div>   

    </body>

</html>

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

<%@ WebService Language="VB" Class="Samples.AspNet.ServerTime" %>

Imports System.Web
Imports System.Web.Services
Imports System.Xml
Imports System.Web.Services.Protocols
Imports System.Web.Script.Services

Namespace Samples.AspNet

    <WebService(Namespace:="http://tempuri.org/")> _
    <WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)> _
    <ScriptService()> _
    Public Class ServerTime
        Inherits System.Web.Services.WebService

        <WebMethod()> _
        Public Function GetServerTime() As String
            Return String.Format("The current time is {0}.", _
                DateTime.Now)

        End Function
    End Class

End Namespace

<%@ WebService Language="C#" Class="Samples.AspNet.ServerTime" %>

using System;
using System.Web;
using System.Web.Services;
using System.Xml;
using System.Web.Services.Protocols;
using System.Web.Script.Services;

namespace Samples.AspNet
{

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ScriptService]
    public class ServerTime : System.Web.Services.WebService
    {

        [WebMethod]
        public string GetServerTime()
        {
            return String.Format("The server time is {0}.", 
                DateTime.Now);

        }

    }

}

Выполнение HTTP-запросов из клиентского сценария AJAX

В предыдущем примере показаны способы вызова веб-служб из клиентского сценария путем вызова автоматически создаваемых прокси-классов для веб-службы. Можно выполнять вызовы веб-служб из клиентского сценария на более низком уровне. Этим можно воспользоваться, если необходимо управлять уровнем связи или выполнять проверку данных, отправляемых на сервер или с сервера. Чтобы вызывать веб-службы таким образом, следует использовать класс WebRequest.

В следующем примере показаны способы использования объекта WebRequest для реализации веб-запросов GET и POST при подключении к указанным URL-адресам (конечные точки HTTP):

// ConnectingEndPoints.js

var resultElement;

function pageLoad()
{
    resultElement = $get("ResultId");
}

// This function performs a GET Web request.
function GetWebRequest()
{
    alert("Performing Get Web request.");

    // Instantiate a WebRequest.
    var wRequest = new Sys.Net.WebRequest();

    // Set the request URL.      
    wRequest.set_url("getTarget.htm");
    alert("Target Url: getTarget.htm");

    // Set the request verb.
    wRequest.set_httpVerb("GET");

    // Set the request callback function.
    wRequest.add_completed(OnWebRequestCompleted);

    // Clear the results area.
    resultElement.innerHTML = "";

    // Execute the request.
    wRequest.invoke();  
}

// This function performs a POST Web request.
function PostWebRequest()
{
    alert("Performing Post Web request.");

    // Instantiate a WebRequest.
    var wRequest = new Sys.Net.WebRequest();

    // Set the request URL.      
    wRequest.set_url("postTarget.aspx");
    alert("Target Url: postTarget.aspx");

    // Set the request verb.
    wRequest.set_httpVerb("POST");

    // Set the request handler.
    wRequest.add_completed(OnWebRequestCompleted);

    // Set the body for he POST.
    var requestBody = 
        "Message=Hello! Do you hear me?";
    wRequest.set_body(requestBody);
    wRequest.get_headers()["Content-Length"] = 
        requestBody.length;

    // Clear the results area.
   resultElement.innerHTML = "";

    // Execute the request.
    wRequest.invoke();              
}


// This callback function processes the 
// request return values. It is called asynchronously 
// by the current executor.
function OnWebRequestCompleted(executor, eventArgs) 
{    
    if(executor.get_responseAvailable()) 
    {
        // Clear the previous results. 

       resultElement.innerHTML = "";

        // Display Web request status. 
       resultElement.innerHTML +=
          "Status: [" + executor.get_statusCode() + " " + 
                    executor.get_statusText() + "]" + "<br/>";

        // Display Web request headers.
       resultElement.innerHTML += 
            "Headers: ";

       resultElement.innerHTML += 
            executor.getAllResponseHeaders() + "<br/>";

        // Display Web request body.
       resultElement.innerHTML += 
            "Body:";

      if(document.all)
        resultElement.innerText += 
           executor.get_responseData();
      else
        resultElement.textContent += 
           executor.get_responseData();
    }

}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

Вызов операций службы WCF в AJAX

Можно осуществлять асинхронный вызов служб Windows Communication Foundation (WCF) (SVC) из клиентского сценария аналогично вызову служб ASMX. В следующем примере показаны способы предоставления и вызова операций служб WCF на веб-странице ASP.NET:

<%@ Page Language="VB" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <style type="text/css">
        body {  font: 11pt Trebuchet MS;
                font-color: #000000;
                padding-top: 72px;
                text-align: center }

        .text { font: 8pt Trebuchet MS }
    </style>
    <title>Simple WCF Service Page</title>

</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            <Services>
                <asp:ServiceReference 
                    Path="SimpleService.svc/ws"/>
            </Services>
            <Scripts>
                <asp:ScriptReference Path="service.js" />
            </Scripts>
        </asp:ScriptManager>
        
        <div>
            <h2>Simple WCF Service</h2>
            <input type='button' name="clickme"  value="Greetings" 
                onclick="javascript:OnClick()" /> &nbsp; &nbsp;
            <input type='button' name="clickme2"  value="Greetings2" 
                onclick="javascript:OnClick2()" />
            <hr/>
            <div>
                <span id="Results"></span>
            </div> 
        </div>

    </form>
</body>
</html>
<%@ Page Language="C#" AutoEventWireup="true"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <style type="text/css">
        body {  font: 11pt Trebuchet MS;
                font-color: #000000;
                padding-top: 72px;
                text-align: center }

        .text { font: 8pt Trebuchet MS }
    </style>
    <title>Simple WCF Service Page</title>

</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server">
            <Services>
                <asp:ServiceReference 
                    Path="SimpleService.svc/ws"/>
            </Services>
            <Scripts>
                <asp:ScriptReference Path="service.js" />
            </Scripts>
        </asp:ScriptManager>
        
        <div>
            <h2>Simple WCF Service</h2>
            <input type='button' name="clickme"  value="Greetings" 
                onclick="javascript:OnClick()" /> &nbsp; &nbsp;
            <input type='button' name="clickme2"  value="Greetings2" 
                onclick="javascript:OnClick2()" />
            <hr/>
            <div>
                <span id="Results"></span>
            </div> 
        </div>

    </form>
</body>
</html>
var ServiceProxy;

function pageLoad()
{
    ServiceProxy = new ISimpleService();
    ServiceProxy.set_defaultSucceededCallback(SucceededCallback);
}

function OnClick()
{
    // var myService = new ISimpleService();
    ServiceProxy.HelloWorld1("George");
}

function OnClick2()
{
    var dc = new DataContractType();
    dc.FirstName = "George";
    dc.LastName = "Washington";
    ServiceProxy.HelloWorld2(dc);      
}

// This is the callback function that
// processes the Web Service return value.
function SucceededCallback(result, userContext, methodName)
{
    var RsltElem = document.getElementById("Results");
    RsltElem.innerHTML = result + " from " + methodName + ".";
}
if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();
Imports System
Imports System.Web
Imports System.Collections
Imports System.Collections.Generic
Imports System.Threading
Imports System.Xml
Imports System.Xml.Serialization
Imports System.Text
Imports System.IO
Imports System.Runtime.Serialization
Imports System.ServiceModel
Imports System.ServiceModel.Description
Imports System.ServiceModel.Dispatcher
Imports System.ServiceModel.Channels
Imports System.ServiceModel.Activation


' This a WCF service which consists of a contract, 
' defined below as ISimpleService, and DataContractType, 
' a class which implements that interface, see SimpleService, 
' and configuration entries that specify behaviors associated with 
' that implementation (see <system.serviceModel> in web.config)
Namespace Aspnet.Samples.SimpleService

    <ServiceContract()> _
    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

using System;
using System.Web;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Xml;
using System.Xml.Serialization;
using System.Text;
using System.IO;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.ServiceModel.Channels;
using System.ServiceModel.Activation;

// This a WCF service which consists of a contract, 
// defined below as ISimpleService, and DataContractType, 
// a class which implements that interface, see SimpleService, 
// and configuration entries that specify behaviors associated with 
// that implementation (see <system.serviceModel> in web.config)

namespace Aspnet.Samples
{
    [ServiceContract()]
    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; }
        }
    }

}

Дополнительные примеры

К началу

Ссылка на классы

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

Пространства имен для клиента

Имя

Описание

Пространство имен Sys.Net

Содержит классы, управляющие взаимодействием между клиентскими приложениями AJAX в ASP.NET и веб-службами на сервере. Пространство имен Sys.Net является частью Microsoft AJAX (библиотека).

Пространство имен Sys.Serialization

Содержит классы, связанные с сериализацией данных для клиентских приложений AJAX в ASP.NET.

Пространство имен Sys.Services

Содержит типы, которые обеспечивают доступ сценариев клиентских приложений AJAX в ASP.NET к службе проверки подлинности, службе профилей и другим службам приложения ASP.NET. Пространство имен Sys.Services является частью Microsoft AJAX (библиотека).

Пространства имен для сервера

Имя

Описание

System.Web.Script.Serialization

Содержит классы, обеспечивающие сериализацию в формат JSON и десериализацию из этого формата для управляемых типов. Также обеспечивает расширенные возможности для настройки сериализации.

К началу

Дополнительные ресурсы

О собственном XMLHTTP

http://www.json.org

Что такое Windows Communication Foundation?

Инфраструктура веб-служб XML

Службы WCF и ASP.NET

Основные сведения о сервисноориентированной архитектуре

Новые возможности

Ниже приводится список новых возможностей ASP.NET версии 3.0.

  • Службы приложения в Windows Communication Foundation (WCF).

  • Службы приложения в AJAX, вызываемые из клиентского приложения .NET Framework.

К началу

См. также

Задачи

Пошаговое руководство. Создание и использование веб-службы с поддержкой AJAX

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

Использование проверки подлинности с помощью форм в ASP.NET AJAX

Общие сведения о службах приложений ASP.NET