Пошаговое руководство. Использование служб приложений ASP.NET

Visual Studio 2010

ASP.NET предоставляет службы приложения, доступные через сеть Интернет. С их помощью можно разрешить клиентским приложениям доступ к сведениям о проверке подлинности пользователей, а также о ролях и профиле. Доступ к данным службам могут получать клиентские приложения, написанные на других языках или работающие в других операционных системах. Единственное требование заключается в том, что данные клиенты должны поддерживать взаимодействие по протоколу SOAP 1.1.

В данном пошаговом руководстве описывается настройка и использование служб приложения ASP.NET. Пошаговое руководство состоит из следующих частей:

  • В первой части показаны способы настройки веб-узла ASP.NET для предоставления служб приложения.

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

  • В последней части описывается развертывание веб-сайта служб приложения в системе Windows Server 2008 и в службах IIS 7.0.

Для выполнения этого пошагового руководства потребуется следующее.

  • Visual Studio 2010. Для данного пошагового руководства нельзя использовать Microsoft Visual Web Developer 2005, поскольку будет создано консольное приложение Windows, которое не поддерживается в Visual Web Developer Express.

  • Установленное на компьютере приложение Microsoft SQL Server или SQL Server Express.

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

ПримечаниеПримечание

Для этого пошагового руководства необходимо использовать проект веб-сайта или веб-приложения на базе файловой системы. Сведения о различиях между этими типами проектов см. в разделе Сравнение проектов веб-приложений с проектами веб-сайтов. При выполнении данного пошагового руководства предполагается, что для запуска примеров вместо служб IIS используется сервер разработки Visual Studio Development Server. Дополнительные сведения см. в разделе Веб-серверы в Visual Studio для веб-проектов ASP.NET. Сведения о развертывании приложения в Windows Server 2008 см. далее в разделе этого руководства Развертывание веб-сайта служб приложения в системе Windows Server 2008.

Создание веб-узла служб приложения

  1. Откройте Visual Studio 2010.

  2. В меню Файл выберите пункт Создать веб-узел.

    Откроется диалоговое окно Новый веб-узел.

  3. В разделе Установленные шаблоны Visual Studio выберите Веб-сайт ASP.NET.

  4. В списке Расположение выберите пункт Файловая система.

  5. В текстовом поле Папка введите имя веб-сайта WcfApplicationServices.

    ПримечаниеПримечание

    Можно использовать любое имя. Если используется другое имя, следует запомнить это имя, чтобы далее в этом пошаговом руководстве подставлять именно его.

  6. Нажмите кнопку ОК.

    Visual Studio создаст новый веб-сайт ASP.NET и откроет страницу Default.aspx.

  7. В меню Вид выберите пункты Другие окна и Окно свойств.

  8. В обозревателе решений щелкните имя веб-сайта.

  9. В окне Свойства присвойте свойству Использовать динамические порты значение False.

    Таким образом Visual Studio получает команду на указание фиксированного порта вместо произвольного порта при запуске сервера разработки ASP.NET. Для выполнения данного пошагового руководства необходимо знать фиксированный номер порта, который будет использован при создании клиентских прокси-классов и файлов конфигурации. Дополнительные сведения см. в разделе Пошаговое руководство. Указание порта сервера разработки.

    ПримечаниеПримечание

    Из окна Страницы свойств нет доступа к окну Свойства веб-узла.

  10. В поле Номер порта введите 8080.

    ПримечаниеПримечание

    Можно использовать любой доступный порт. Если используется другой порт, следует отметить номер порта, чтобы впоследствии можно было заменить его на номер 8080.

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

Создание сведений о пользователях и ролях

  1. Добавьте к веб-сайту файл Global.asax.

  2. Откройте файл Global.asax и замените в нем существующий метод Application_Start на следующий код:

    
    
        void Application_Start(object sender, EventArgs e) {
    
            if (!Roles.RoleExists("Managers")) {
                Roles.CreateRole("Managers");
            }
            if (!Roles.RoleExists("Friends")) {
                Roles.CreateRole("Friends");
            }
        }
    
    
    
    

    При первом доступе к веб-сайту код создает локальную базу данных Aspnetdb.mdf в папке App_Data и добавляет в нее роли Managers и Friends. Эта база данных используется для хранения сведений об учетных данных, ролях и профиле пользователя.

  3. Откройте страницу Default.aspx и замените разметку на странице следующей разметкой.

    
    <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
    
    <!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">
        <title>Application Services Home Page</title>
    <style type="text/css">
    td{padding:6px; vertical-align:top;border:solid 1px #eeeeee;}
    </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>Application Services Home Page</h1>
    
            The following selections let you create users, assign them to roles, and
            set their profile information.
    
            <p>
                <asp:Label ID="LoggedId"  Font-Bold="true" ForeColor="red" runat="server"/>
            </p>
    
            <table>
                <tr>
                    <td align="right" >Log in:</td>
                    <td align="left"><asp:LoginStatus ID="LoginStatus1" runat="server" /></td>
                </tr>
                <tr>
                    <td align="right" >Set profile information:<br/>(You must be logged in.)</td>
                    <td align="left"><a href="ProfileInfo.aspx" target="_self">Profile Information</a></td>
                </tr>
                <tr>
                    <td align="right" >Create user and assign role:</td>
                    <td align="left"><a href="CreateUser.aspx"target="_self">New User</a></td>
                </tr>
    
             </table>
        </div>
    
        </form>
    </body>
    </html>
    
    
    

    Эта разметка создает ссылки на страницу входа, страницу сведений о профиле и страницу нового пользователя. Эти страницы будут добавлены позднее в данном пошаговом руководстве.

  4. В файле Default.aspx с выделенным кодом добавьте следующий код в метод Page_Load:

    
    using System;
    using System.Web;
    
    public partial class _Default : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
    
            if (HttpContext.Current.User.Identity.IsAuthenticated) {
                LoggedId.Text = HttpContext.Current.User.Identity.Name +
                    " you are logged in.";
            } else
                LoggedId.Text = "You are not logged in.";
    
        }
    }
    
    
    

    Этот код определяет, прошел ли текущий пользователь проверку подлинности.

  5. Добавьте страницу с именем Login.aspx.

  6. Добавьте элемент управления Login в файл Login.aspx.

    В следующем примере показана разметка для файла Login.aspx.

    
    
    <%@ Page 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 id="Head1" runat="server">
        <title>User Login Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <h1>
            Log In</h1>
        <div>
            <%--    The Login control does all the work.  --%>
            <asp:Login ID="Login1" runat="server">
            </asp:Login>
        </div>
        </form>
    </body>
    </html>
    
    
    
  7. Добавьте страницу с именем ProfileInfo.aspx и убедитесь в том, что флажок Размещать код в отдельном файле установлен.

  8. Добавьте на страницу ProfileInfo.aspx следующую разметку:

    
    
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="ProfileInfo.aspx.cs" Inherits="ProfileInfo" %>
    
    <!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">
        <title>User Profile Information Page</title>
        <style type="text/css">
            td
            {
                padding: 6px;
                vertical-align: top;
                border: solid 1px #eeeeee;
            }
        </style>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>
                View and Update User Profile Information</h1>
            <p>
                This page lets you view and set profile information for the currently logged-in
                user.</p>
            <p>
                <a href="Default.aspx">Back to default page</a></p>
            <h2>
                View Profile Information</h2>
            &nbsp;<table>
                <tr>
                    <td align="right">
                        User name:
                    </td>
                    <td align="left">
                        <asp:Label ID="Lbl_UserName" runat="server" Font-Bold="true" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        User roles:
                    </td>
                    <td align="left">
                        <asp:Label ID="Lbl_Roles" runat="server" Font-Bold="true" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        First name:
                    </td>
                    <td>
                        <asp:Label ID="Lbl_FirstName" runat="server" Font-Bold="true" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        Last name:
                    </td>
                    <td>
                        <asp:Label ID="Lbl_LastName" runat="server" Font-Bold="true" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        Phone number:
                    </td>
                    <td>
                        <asp:Label ID="Lbl_Phone" runat="server" Font-Bold="true" />
                    </td>
                </tr>
            </table>
            <br />
            <asp:Button ID="But_ReadProfile" runat="server" OnClick="But_ReadProfile_Click" Text="Read Profile Information" />
            <br />
            <hr />
            <h2>
                Update Profile Information
            </h2>
            <table>
                <tr>
                    <td align="right">
                        First name:
                    </td>
                    <td align="left">
                        <asp:TextBox ID="TB_FirstName" runat="server" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        Last name:
                    </td>
                    <td align="left">
                        <asp:TextBox ID="TB_LastName" runat="server" />
                    </td>
                </tr>
                <tr>
                    <td align="right">
                        Phone number:
                    </td>
                    <td align="left">
                        <asp:TextBox ID="TB_phoneNumber" runat="server" />
                    </td>
                </tr>
            </table>
            <br />
            <asp:Button ID="But_UpdateProfile" runat="server" OnClick="But_UpdateProfile_Click"
                Text="Update Profile Data" />
        </div>
        </form>
    </body>
    </html>
    
    
    

    Страница профиля содержит элементы управления Label, используемые для отображения имени и роли пользователя, и элементы управления TextBox, используемые для изменения имени пользователя и его телефонного номера.

  9. В файле с выделенным кодом для страницы ProfileInfo.aspx добавьте следующий код:

    
    public partial class ProfileInfo : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
            ProfileCommon Profile = HttpContext.Current.Profile as ProfileCommon;
    
            if (HttpContext.Current.User.Identity.IsAuthenticated) {
                Lbl_UserName.Text = HttpContext.Current.User.Identity.Name;
                string[] roles = Roles.GetRolesForUser();
                Lbl_Roles.Text = "";
                foreach (string r in roles) {
                    Lbl_Roles.Text += r + " ";
                }
    
                Lbl_FirstName.Text = Profile.FirstName;
                Lbl_LastName.Text = Profile.LastName;
                Lbl_Phone.Text = Profile.PhoneNumber;
    
            } else {
                Lbl_UserName.Text = "User is not logged in.";
                Lbl_UserName.ForeColor = System.Drawing.Color.Red;
            }
        }
    
        protected void But_ReadProfile_Click(object sender, EventArgs e) {
            if (HttpContext.Current.User.Identity.IsAuthenticated) {
                Lbl_UserName.Text = HttpContext.Current.User.Identity.Name;
                string[] roles = Roles.GetRolesForUser();
                Lbl_Roles.Text = "";
                foreach (string r in roles) {
                    Lbl_Roles.Text += r + " ";
                }
    
                Lbl_FirstName.Text = Profile.FirstName;
                Lbl_LastName.Text = Profile.LastName;
                Lbl_Phone.Text = Profile.PhoneNumber;
    
            } else {
                Lbl_UserName.Text = "User is not logged in.";
                Lbl_UserName.ForeColor = System.Drawing.Color.Red;
            }
        }
    
        protected void But_UpdateProfile_Click(object sender, EventArgs e) {
            if (HttpContext.Current.User.Identity.IsAuthenticated) {
                Profile.FirstName = TB_FirstName.Text;
                Profile.LastName = TB_LastName.Text;
                Profile.PhoneNumber = TB_phoneNumber.Text;
            }
        }
    }
    
    
    
    

    Код на данной странице позволяет получать и изменять сведения о профиле пользователя.

    ПримечаниеПримечание

    Проект не будет скомпилирован до тех пор, пока не будут включены свойства профиля для данного веб-узла. Это будет сделано в следующей процедуре.

  10. Добавьте страницу с именем CreateUser.aspx и добавьте в нее следующую разметку.

    
    <%@ Page Language="VB" AutoEventWireup="true" CodeFile="CreateUser.aspx.vb" Inherits="CreateUser" %>
    
    <!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">
        <title>Add New User</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
    
            <h2>Add New User</h2>
    
            <a href="Default.aspx">back to default page</a>
    
    		<asp:CreateUserWizard ID="CreateUserWizard1" runat="server"
    		  OnCreatedUser="On_CreatedUser">
    			<wizardsteps>
    				<asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server"  />
    				<asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server"  />
    			</wizardsteps>
    		</asp:CreateUserWizard>
    
    		<span style="font-weight:bold; color:Red">Security Group</span> <br />
    		<asp:RadioButton ID="RDO_Friends"  Text="Friends" runat="server" Checked="true"  GroupName="GP1"/>
    		<asp:RadioButton ID="RDO_Manager" Text="Managers" runat="server" GroupName="GP1" />
        </div>
        </form>
    </body>
    </html>
    
    
    
    
    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="CreateUser.aspx.cs" Inherits="CreateUser" %>
    
    <!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">
        <title>Add User Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <h1>Add User</h1>
            <a href="Default.aspx">Back to default page</a><br />
            &nbsp;<asp:CreateUserWizard ID="CreateUserWizard1" runat="server" OnCreatedUser="On_CreatedUser">
                <WizardSteps>
                    <asp:CreateUserWizardStep ID="CreateUserWizardStep1" runat="server" />
                    <asp:CompleteWizardStep ID="CompleteWizardStep1" runat="server" />
                </WizardSteps>
            </asp:CreateUserWizard>
            <span style="font-weight: bold; color: Red">Security Group</span>
            <br />
            <asp:RadioButton ID="RDO_Friends" Text="Friends" runat="server" Checked="true" GroupName="GP1" />
            &nbsp;
            <asp:RadioButton ID="RDO_Manager" Text="Managers" runat="server" GroupName="GP1" />
        </div>
        </form>
    </body>
    </html>
    
    
    
    
    
    using System;
    using System.Web;
    using System.Web.Security;
    
    public partial class CreateUser : System.Web.UI.Page {
        protected void Page_Load(object sender, EventArgs e) {
    
        }
        protected void On_CreatedUser(object sender, EventArgs e) {
            string userName = CreateUserWizard1.UserName;
            if (RDO_Manager.Checked){
                HttpContext.Current.Response.Write(userName);
                Roles.AddUserToRole(userName, "Managers");
            } else
                Roles.AddUserToRole(userName, "Friends");
    
            HttpContext.Current.Response.Redirect("~/default.aspx");
        }
    }
    
    
    
  11. В файле с выделенным кодом для страницы CreateUser.aspx добавьте следующий код:

    На данной странице можно создавать пользователей и назначать для них роли.

На следующем этапе предлагается включить на веб-узле свойства проверки подлинности форм, ролей и профиля. Это можно сделать с помощью параметров в файле "Web.config".

Настройка свойств проверки подлинности, ролей и профиля

  1. Откройте файл Web.config веб-сайта.

  2. В элементе authentication раздела system.web настройте установленную по умолчанию проверку подлинности Windows на использование форм, как показано в следующем примере.

    <authentication mode="Forms" />
    
  3. В разделе system.web настройте службу ролей, добавив элемент roleManager, как показано в следующем примере.

    <roleManager enabled="true"/>
    
  4. В разделе system.web настройте службу профиля с помощью раздела profile и его элемента properties, как показано в следующем примере.

    <profile enabled="true">
      <properties>
        <add name="FirstName"    type="String"/>
        <add name="LastName"     type="String"/>
        <add name="PhoneNumber"  type="String"/>
      </properties>
    </profile>
    

    Этот параметр профиля задает три свойства (FirstName, LastName и PhoneNumber), которые будут управляться службой профиля ASP.NET. Во время выполнения ASP.NET будет динамически создавать класс типа ProfileCommon, содержащий эти свойства.

    В следующем примере показана часть файла Web.config со всеми требуемыми изменениями.

    <system.web>
    <!-- Other settings. -->
    <authentication mode="Forms" />
    <roleManager enabled="true"/>
    <profile enabled="true">
      <properties>
        <add name="FirstName"    type="String"/>
        <add name="LastName"     type="String"/>
        <add name="PhoneNumber"  type="String"/>
      </properties>
    </profile>
    <!-- Other settings. -->
    </system.web>
    

Теперь можно приступать к созданию сведений о пользователе, которые впоследствии будут использованы для входа.

Создание пользователей и назначение сведений о профиле

  1. Выберите в обозревателе решений страницу Default.aspx, а затем нажмите сочетание клавиш CTRL+F5, чтобы запустить эту страницу.

    Страница откроется в обозревателе со следующим URL-адресом:

    http://localhost:8080/WcfApplicationServices/Default.aspx
    
  2. Выберите пункт Новый пользователь.

    Отобразится страница "CreateUser.aspx".

  3. Необходимо создать несколько пользователей и назначить для них предварительно определенные роли. Для этого следует ввести учетные данные пользователя и выбрать команду Создать пользователя.

    Запишите созданные имена пользователей и пароли. Эти сведения потребуются для того, чтобы назначить или изменить сведения о профиле пользователя.

    Например, создайте пользователя с именем joeM и установите переключатель Managers, чтобы сделать пользователя joeM участником роли Managers. Создайте второго пользователя с именем joeNA и установите переключатель Friends. Пользователь joeNA будет участником роли Friends, но не будет участником роли Managers. Роли Friends и Managers созданы кодом, который был добавлен ранее в метод Application_Start файла Global.asax.

    После завершения создания пользователя произойдет переадресация на страницу Default.aspx.

  4. На странице "Default.aspx" выберите команду Вход.

    Отобразится страница "Login.aspx".

  5. Следует выполнить вход с помощью учетных данных одного из ранее созданных пользователей.

    Если вход выполнен успешно, произойдет переадресация на страницу Default.aspx.

  6. Выберите пункт Сведения о профиле.

    Отобразится страница "Profile.aspx".

  7. Необходимо ввести или обновить сведения о профиле пользователя, для которого выполнен вход, путем ввода имени, фамилии и номера телефона.

  8. Выберите команду Обновить данные профиля.

  9. Выберите пункт Чтение сведений о профиле.

    Отобразится только что введенная информация. Этот шаг позволяет убедиться, что свойства профиля работают.

  10. Вернитесь на страницу Default.aspx.

  11. Выйдите из учетной записи пользователя в роли Managers.

  12. Войдите в систему как пользователь из роли Friends.

    Например, войдите в качестве пользователя joeNA.

  13. Введите сведения о профиле для пользователя, вошедшего в систему.

Создание пользователей, ролей и сведений о профиле завершено. Теперь следует открыть доступ к сведениям для клиентских приложений.

Сопоставление и настройка служб приложения

Теперь можно предоставить сведения о созданном пользователе с помощью служб приложения ASP.NET. Прежде чем получить доступ к учетным данным пользователя и сведениям о профиле клиента, необходимо создать файлы сопоставления (SVC), которые указывают на службы приложения. Таким образом можно открыть доступ к службам для любого приложения, запущенного на любой платформе, которое может принимать и получать сообщения в формате SOAP. Также необходимо настроить веб-узел таким образом, чтобы службы приложения предоставлялись в сети.

Создание файлов сопоставления служб приложения

  1. Добавьте файл служб WCF (SVC-файл) на веб-сайт и присвойте ему имя MyAuthenticationSvcWrap.svc.

  2. Откройте файл MyAuthenticationSvcWrap.svc и замените существующую директиву @ ServiceHost следующей директивой, которая создает ссылку на класс System.Web.ApplicationServices.AuthenticationService:

    <%@ ServiceHost Language="VB"
      Service="System.Web.ApplicationServices.AuthenticationService" 
        Debug="true" %>
    

    <%@ ServiceHost Language="C#"
      Service="System.Web.ApplicationServices.AuthenticationService" 
        Debug="true" %>
    

    В данном примере службы не реализуется пользовательская служба проверки подлинности. Вместо этого вызывается встроенный класс System.Web.ApplicationServices.AuthenticationService.

  3. Удалите файлы интерфейса и класса для службы MyAuthenticationSvcWrap в каталоге App_Code (App_Code\MyAuthenticationSvcWrap и App_Code\IMyAuthenticationSvcWrap).

    Эти файлы интерфейса и класса были созданы при добавлении SVC-файла в проект. Эти файлы не нужны, поскольку используется служба System.Web.ApplicationServices.AuthenticationService, а пользовательская служба не реализуется.

  4. Добавьте еще один файл служб WCF (SVC-файл) на веб-узел и присвойте ему имя MyRoleSvcWrap.svc.

  5. Откройте файл MyRoleSvcWrap.svc и замените его содержимое следующей директивой @ ServiceHost, создающей ссылку на класс System.Web.ApplicationServices.RoleService:

    <%@ ServiceHost Language="VB" 
       Service="System.Web.ApplicationServices.RoleService"    %>
    

    <%@ ServiceHost Language="C#" 
      Service="System.Web.ApplicationServices.RoleService"   %>
    
  6. В каталоге App_Code удалите файлы интерфейса и класса для службы MyRoleSvcWrap.

  7. Добавьте еще один файл служб WCF (SVC-файл) на веб-узел и присвойте ему имя MyProfileSvcWrap.svc.

  8. Откройте файл MyProfileSvcWrap.svc и замените его содержимое следующей директивой, создающей ссылку на класс System.Web.ApplicationServices.ProfileService:

    <%@ ServiceHost Language="VB"
      Service="System.Web.ApplicationServices.ProfileService" 
      %>
    

    <%@ ServiceHost Language="C#"
    Service="System.Web.ApplicationServices.ProfileService" 
    %>
    
  9. В каталоге App_Code удалите файлы интерфейса и класса для службы MyProfileSvcWrap.

  10. Сохраните и закройте все SVC-файлы

  11. Выполните построение проекта WcfApplicationServices, чтобы убедиться в том, что разметка, код и параметры конфигурации компилируются.

Теперь можно приступить к настройке веб-приложения для предоставления служб приложения.

Настройка служб приложения

  1. Откройте файл Web.config или переключитесь на него.

  2. Между элементами configSections и appSettings добавьте новый элемент system.web.extensions.

  3. Добавьте элемент scripting в элемент system.web.extensions.

  4. В элементе scripting включите службы проверки подлинности, профиля и ролей с помощью раздела webServices.

    В следующем примере показан готовый элемент system.web.extensions.

    <configSections>
      ...
    </configSections>
    
    <system.web.extensions>
      <scripting>
        <webServices>
          <authenticationService enabled="true"
           requireSSL = "false"/>
          <profileService
              enabled="true"
              readAccessProperties="FirstName,LastName,PhoneNumber"/>
          <roleService enabled="true"/>
        </webServices>
      </scripting>
    </system.web.extensions>
    <appSettings/>
    
    ПримечаниеПримечание

    На реальном веб-сайте необходимо установить атрибут requireSSL равным true.

  5. В качестве дочернего элемента раздела system.serviceModel добавьте элемент serviceHostingEnvironment и установите его атрибут aspNetCompatibilityEnabled равным true.

    В следующем примере показан готовый элемент serviceHostingEnvironment.

    <runtime>
      ...
    </runtime>
    
    <system.serviceModel>
      <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <behaviors>
      ...
    </behaviors>
    
  6. В группе system.serviceModel настройте службы приложения, чтобы открыть к ним доступ для клиентских приложений с помощью протокола SOAP. Для этого выполните следующие действия:

    1. В элементе system.serviceModel найдите элемент <behaviors><serviceBehaviors><behavior>, атрибут имени которого имеет значение MyAuthenticationSvcWrapBehavior.

    2. Измените значение атрибута name элемента behavior с MyAuthenticationSvcWrapBehavior на AppServiceBehaviors. В этом пошаговом руководстве приложение настраивается на использование поведения AppServiceBehaviors для всех трех служб.

    3. Удалите элементы behavior с именами MyRoleSvcWrapBehavior и MyProfileSvcWrapBehavior из элемента <system.serviceModel><behaviors><serviceBehaviors>.

  7. Перейдите в элемент <system.serviceModel><services><service> с атрибутом behaviorConfiguration, значение которого равно MyAuthenticationSvcWrapBehavior, и выполните следующие действия.

    1. Измените значение атрибута behaviorConfiguration со значения MyAuthenticationSvcWrapBehavior на AppServiceBehaviors.

    2. Измените значение атрибута name со значения MyAuthenticationSvcWrap на System.Web.ApplicationServices.AuthenticationService.

  8. Настройте элемент <service><endpoint>, выполнив следующие действия:

    1. Удалите атрибут address.

    2. Измените значение атрибута binding со значения wsHttpBinding на basicHttpBinding.

    3. Измените значение атрибута contract со значения IMyAuthenticationSvcWrap на System.Web.ApplicationServices.AuthenticationService.

    4. Добавьте атрибут bindingNamespace и задайте для него значение http://asp.net/ApplicationServices/v200.

    5. Удалите дочерний элемент identity.

    6. Удалите элемент endpoint, атрибут address которого имеет значение mex.

    В следующем примере показана разметка для элемента проверки подлинности service.

    <service behaviorConfiguration="AppServiceBehaviors" 
        name="System.Web.ApplicationServices.AuthenticationService">
      <endpoint binding="basicHttpBinding"  
        bindingNamespace="http://asp.net/ApplicationServices/v200"  
        contract="System.Web.ApplicationServices.AuthenticationService"/>
      </endpoint>
    </service>
    

    Дополнительные сведения см. в разделах <service> element и <endpoint> element.

  9. Повторите шаг 7 для элементов службы с атрибутом behaviorConfiguration, значения которого равны MyRoleSvcWrapBehavior и MyProfileSvcWrapBehavior. Замените следующие значения для атрибутов name и contract:

    • System.Web.ApplicationServices.RoleService

    • System.Web.ApplicationServices.ProfileService

    В следующем примере показан завершенный элемент system.serviceModel.

    <configuration>
      ...
    
      <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
        <services>
          <!-- this enables the WCF AuthenticationService endpoint -->
          <service behaviorConfiguration="AppServiceBehaviors"
              name="System.Web.ApplicationServices.AuthenticationService">
            <endpoint binding="basicHttpBinding"
                bindingNamespace="http://asp.net/ApplicationServices/v200"
                contract="System.Web.ApplicationServices.AuthenticationService"/>
          </service>
          <!-- this enables the WCF RoleService endpoint -->
          <service behaviorConfiguration="AppServiceBehaviors"
              name="System.Web.ApplicationServices.RoleService">
            <endpoint binding="basicHttpBinding"
                bindingNamespace="http://asp.net/ApplicationServices/v200"
                contract="System.Web.ApplicationServices.RoleService"/>
          </service>
          <!-- this enables the WCF ProfileService endpoint -->
          <service behaviorConfiguration="AppServiceBehaviors"
              name="System.Web.ApplicationServices.ProfileService">
            <endpoint binding="basicHttpBinding"
                bindingNamespace="http://asp.net/ApplicationServices/v200"
                contract="System.Web.ApplicationServices.ProfileService"/>
          </service>
        </services>
    
        <behaviors>
          <serviceBehaviors>
            <behavior name="AppServiceBehaviors">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
      </system.serviceModel>
      ...
    </configuration>
    

Теперь можно запустить веб-службу для активации служб проверки подлинности, профиля и ролей, которые будут использоваться клиентским приложением. Это также позволяет выполнять проверку правильности работы службы приложения.

Активация веб-узла для предоставления служб приложения

  • В обозревателе решений щелкните файл MyAuthenticationSvcWrap.svc правой кнопкой мыши и выберите пункт Просмотр в браузере.

    Будет вызвана веб-служба, и в обозревателе появится страница, на которой приведены инструкции по тестированию службы. Запишите URL-адрес службы (URL-адрес, заканчивающийся на "?wsdl"), поскольку он понадобится на следующих этапах для доступа к службе из клиентского приложения. Повторите этот процесс для других файлов службы.

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

В данном разделе демонстрируются способы создания клиентского приложения в виде консольного приложения Windows для доступа к службам приложения. Эти службы приложений могут вызываться любым клиентом, который может отправлять и получать сообщения в формате SOAP.

Для создания клиентского консольного приложения необходимо выполнить несколько стандартных действий:

  • Создать клиентское приложение.

  • Создать файлы служб приложения прокси-класса и связанный файл конфигурации app.config.

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

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

    ПримечаниеПримечание

    При передаче в службу конфиденциальных данных (например, учетных данных проверки подлинности) следует использовать SSL с протоколом HTTPS. Например, как показано далее в одном из примеров, значение атрибута requireSSL элемента authenticationService будет изменено с false на true. Это действие не следует выполнять в рамках данного руководства, так как в нем не описывается процесс настройки сайта для использования протокола SSL. Дополнительные сведения см. в разделах Безопасность транспортировки и Безопасность HTTP и веб-службы ASP.NET на веб-узле MSDN и в разделе Настройка протокола SSL в службах IIS 7.0 на веб-узле IIS.

Создание консольного приложения Windows

  1. В Visual Studio в меню Файл выберите команду Добавить, после чего выберите пункт Новый проект.

  2. Выберите желаемый язык, а затем в меню Установленные шаблоны Visual Studio выберите пункт Консольное приложение.

  3. Присвойте приложению имя AppSvcClient, введите путь для приложения и нажмите кнопку ОК.

    Visual Studio добавит проект в существующее решение и откроет файл класса по умолчанию.

  4. Правой кнопкой мыши щелкните имя консольного приложения и нажмите кнопку Добавить ссылку.

  5. В диалоговом окне Добавление ссылки щелкните вкладку .NET, выберите пункт System.ServiceModel и System.Runtime.Serialization, а затем нажмите кнопку ОК. При использовании Visual Basic следует также добавить элемент System.Web.Extensions.

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

Создание прокси-классов и сведений конфигурации для служб приложения

Теперь можно приступить к созданию прокси-классов и сведений конфигурации, которые позволят открыть доступ для консольного приложения к службам приложения из консольного приложения AppSvcClient. Для каждой службы приложения отдельно создается прокси-класс и конфигурация.

Создание прокси-классов для служб приложения

  1. В меню Windows Пуск последовательно выберите команды Все программы, Microsoft Visual Studio 2008, Средства Visual Studio и Командная строка Visual Studio 2008.

    ПримечаниеПримечание

    При работе в Windows Vista® следует выполнить эту команду от имени администратора.

    В результате будет открыто окно командной строки Windows с параметрами среды, в состав которых входит путь к средствам платформы .NET Framework.

  2. В командной строке Windows перейдите в каталог, в котором содержится файл Program.cs или Module1.vb для приложения AppSvcClient.

  3. Создайте прокси-класс службы проверки подлинности с помощью служебной программы службы (Svcutil.exe). Выполните следующие действия.

    1. В обозревателе решений щелкните файл MyAuthenticationSvcWrap.svc правой кнопкой мыши и выберите пункт Просмотр в браузере.

    2. Скопируйте команду svcutil.exe из окна браузера.

    3. Вставьте команду из окна браузера в командное окно Windows, открытое на шаге 1.

    4. При работе в Visual Basic добавьте к команде строку /language:"VB".

    Эта команда показана в следующем примере.

    svcutil http://localhost:8080/WcfApplicationServices/MyAuthenticationSvcWrap.svc?wsdl /language:"VB"
    

    svcutil.exe http://localhost:8080/WcfApplicationServices/MyAuthenticationSvcWrap.svc?wsdl
    
    ПримечаниеПримечание

    По умолчанию установлен выходной язык C#. Флаг /language:"VB" требуется только для Visual Basic. Команда svcutil отображается в браузере при просмотре файла MyAuthenticationSvcWrap.svc.

    Значение "localhost:8080" должно совпадать с URL-адресом, используемым в данном пошаговом руководстве при запуске веб-узла. Если для сервера разработки ASP.NET используется другой номер порта, или назначается динамический порт, следует заменить соответствующее значение. При изменении номера порта следует обновить CONFIG-файл, созданный с помощью инструмента "Svcutil.exe", в целях соответствия новому номеру порта.

    Имя SVC-файла в команде должно соответствовать имени, ранее использованному в данном пошаговом руководстве при создании SVC-файлов. Так как имя для созданного прокси-класса не указано явным образом, имя созданного класса основано на имени службы, которое присвоено в SVC-файле веб-сайта (AuthenticationServices).

  4. Измените имя файла конфигурации output.config, созданного служебной программой службы, на App.config.

    ПримечаниеПримечание

       Не закрывайте командное окно Windows — в рамках данного руководства будут созданы дополнительные прокси-классы.

  5. В обозревателе решений щелкните правой кнопкой мыши консольное приложение, выберите команду Добавить, выберите пункт Существующий элемент, выделите созданный файл прокси-класса AuthenticationService и нажмите кнопку Добавить.

  6. Добавьте файл App.config в проект приложения консоли, выполнив действия, описанные на предыдущем шаге.

  7. В основном файле класса консольного приложения добавьте следующий код для создания теста.

    
    using System;
    using System.Text;
    using System.ServiceModel;
    
    class Program {
    
        static void Main(string[] args) {
    
            string username = "joeNA";
            string password = "*(IU89iu";
            bool bLogin = false;
    
            // BasicHttpBinding and endpoint are provided in app.config file.
            AuthenticationServiceClient authService = new AuthenticationServiceClient();
            string customCredential = "Not used by the default membership provider.";
    
            // Authentication ticket remains valid across sessions.
            bool isPersistent = true;
    
            bLogin = authService.Login(username, password, customCredential, isPersistent);
    
            if (bLogin == true)
                Console.WriteLine("Welcome " + username + ". You have logged in.");
            else
                Console.WriteLine("Unable to login!");
        }
    }
    
    
    

    Этот код позволяет передавать в службу имя пользователя и его пароль при запуске ее из консольного приложения. Можно использовать значения имен пользователей и паролей, созданных ранее в ходе выполнения данного пошагового руководства.

    Это тестовое приложение получает сведения о привязке и конечных точках из файла App.config.

  8. Протестируйте проект, выполнив следующие действия:

    1. Измените имя пользователя и пароль на значения, использованные ранее в этом пошаговом руководстве.

    2. В окне Обозревателя решений щелкните правой кнопкой мыши имя приложения консоли (AppSvcClient) и в контекстном меню выберите команду Назначить запускаемым проектом.

    3. Чтобы запустить приложение в Visual Studio, нажмите клавиши CTRL+F5.

    Консольное приложение отобразит сообщение, указывающее на то, что был выполнен вход.

  9. Создайте прокси-класс службы профиля, выполнив следующие действия:

    1. В обозревателе решений щелкните правой кнопкой мыши файл MyProfileSvcWrap.svc и выберите пункт Просмотр в браузере.

    2. Скопируйте команду svcutil.exe из окна браузера.

    3. Вставьте команду из окна браузера в командное окно Windows, открытое на шаге 1.

    4. При работе в Visual Basic добавьте к команде строку /language:"VB".

    5. Добавьте параметр конфигурации объединения (/mergeConfig).

    Эта команда показана в следующем примере.

    svcutil.exe http://localhost:8080/WcfApplicationServices/MyProfileSvcWrap.svc?wsdl /language:"VB" /config:app.config /mergeConfig
    

    svcutil.exe http://localhost:8080/WcfApplicationServices/MyProfileSvcWrap.svc?wsdl /language:"C#" /config:app.config /mergeConfig
    

    Параметр /config:app.config задает файл App.config в качестве файла конфигурации вместо файла output.config, заданного по умолчанию. Параметр /mergeConfig указывает, что данные конфигурации, созданные на этом шаге, должны быть объединены со сведениями, уже имеющимися в файле App.config в результате выполнения предыдущих шагов.

  10. Создайте прокси-класс службы ролей, выполнив следующие действия:

    1. В обозревателе решений щелкните файл MyRoleSvcWrap.svc правой кнопкой мыши и выберите пункт Просмотр в браузере.

    2. Скопируйте команду svcutil.exe из окна браузера.

    3. Вставьте команду из окна браузера в командное окно Windows, открытое на шаге 1.

    4. При работе в Visual Basic добавьте к команде строку /language:"VB".

    5. Добавьте параметр конфигурации объединения (/mergeConfig).

    Эта команда показана в следующем примере.

    svcutil.exe http://localhost:8080/WcfApplicationServices/MyRoleSvcWrap.svc?wsdl /language:"VB" /config:app.config /mergeConfig
    

    svcutil.exe http://localhost:8080/WcfApplicationServices/MyRoleSvcWrap.svc?wsdl  /language:"C#" /config:app.config /mergeConfig
    
  11. В обозревателе решений щелкните правой кнопкой мыши консольное приложение, выберите команду Добавить, выберите пункт Существующий элемент, выделите три созданных файла прокси-класса и нажмите кнопку Добавить.

    Прокси-классы расположены в той же папке, что и файл App.config, и называются AuthenticationService, ProfileService и RoleService.

  12. Замените код в классе Program следующим кодом:

    
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Channels;
    using System.ComponentModel;
    using System.Web;
    using System.Net;
    
    
    class MyServiceTst {
    
        string _Host { get; set; }
    
        CookieContainer GetCookies(OperationContext oc) {
            HttpResponseMessageProperty httpResponseProperty =
                (HttpResponseMessageProperty)oc.IncomingMessageProperties[HttpResponseMessageProperty.Name];
            if (httpResponseProperty != null) {
                CookieContainer cookieContainer = new CookieContainer();
                string header = httpResponseProperty.Headers[HttpResponseHeader.SetCookie];
    
                if (header != null) {
                    cookieContainer.SetCookies(new Uri(@"http://someuri.tld"), header);
                }
                return cookieContainer;
            }
            return null;
        }
    
        void SetCookies(OperationContext oc, CookieContainer cookieContainer) {
    
            HttpRequestMessageProperty httpRequestProperty = null;
            if (oc.OutgoingMessageProperties.ContainsKey(HttpRequestMessageProperty.Name)) {
                httpRequestProperty =
                    oc.OutgoingMessageProperties[HttpRequestMessageProperty.Name]
                    as HttpRequestMessageProperty;
            }
    
            if (httpRequestProperty == null) {
                httpRequestProperty = new HttpRequestMessageProperty();
                oc.OutgoingMessageProperties.Add(HttpRequestMessageProperty.Name,
                    httpRequestProperty);
            }
            httpRequestProperty.Headers.Add(HttpRequestHeader.Cookie,
                cookieContainer.GetCookieHeader(new Uri(@"http://someuri.tld")));
        }
    
    
        void GetUserRoles(CookieContainer cookieContainer) {
    
            string endPtAddr = strEndPtAddr("MyRoleSvcWrap");
    
            RoleServiceClient roleSvc = new RoleServiceClient(new BasicHttpBinding(),
                 new EndpointAddress(endPtAddr));
    
            using (new OperationContextScope(roleSvc.InnerChannel)) {
                // CookieContainer must be set in order to call GetRolesForCurrentUser().
                // 1638
                SetCookies(OperationContext.Current, cookieContainer);
                string[] roles = roleSvc.GetRolesForCurrentUser();
                if (roles.Length == 0) {
                    Console.WriteLine("User does not belong to any role.");
                } else {
                    string userRoles = "";
                    for (int i = 0; i < roles.Length; i++) {
                        userRoles += roles[i] + " ";
                    }
                    Console.WriteLine("User's roles: " + userRoles);
                }
            }
        }
    
        void GetProfileInfo(CookieContainer cookieContainer) {
    
            string endPtAddr = strEndPtAddr("MyProfileSvcWrap");
    
            ProfileServiceClient profileSvc = new ProfileServiceClient(new BasicHttpBinding(),
                 new EndpointAddress(endPtAddr));
    
            string[] strProfileProps = new string[] { "FirstName", "LastName", "PhoneNumber" };
    
            using (new OperationContextScope(profileSvc.InnerChannel)) {
                SetCookies(OperationContext.Current, cookieContainer);
                Dictionary<string, object> profileData =
                    profileSvc.GetPropertiesForCurrentUser(strProfileProps, true);
    
                foreach (string sProp in strProfileProps)
                    Console.WriteLine(sProp + ": " + profileData[sProp]);
    
            }
        }
    
        public string strEndPtAddr(string service) {
    
            string endPtAddr = @"http://" + _Host + "/WcfApplicationServices/"
                + service + ".svc?wsdl";
    
            return endPtAddr;
        }
    
        public MyServiceTst(string[] args) {
    
            if (args.Length == 3)
                // The host address was passed in, so that is used.
                _Host = args[2];
            else
                _Host = "localhost:8080";
    
            string username = args[0];
            string password = args[1];
            string endPtAddr = strEndPtAddr("MyAuthenticationSvcWrap");
    
            Console.WriteLine("Attempting to connect as username = " + username
                + "\n password length = " + password.Length.ToString()
                + "\n on server " + _Host + "\n"
                + "\n" + "End point address: "  + endPtAddr
            );
    
            // BasicHttpBinding and endpoint are explicitly passed and ignored
            // in th app.config file.
            BasicHttpBinding binding = new BasicHttpBinding();
            AuthenticationServiceClient authService = new AuthenticationServiceClient(binding,
                                                         new EndpointAddress(endPtAddr));
    
            CookieContainer cookieContainer;
            string customCredential = "Not used by the default membership provider.";
    
            // Authentication ticket remains valid across sessions.
            bool isPersistent = true;
            bool bLogin = false;
    
            using (new OperationContextScope(authService.InnerChannel)) {
                try {
                    bLogin = authService.Login(username, password,
                                                 customCredential, isPersistent);
                    cookieContainer = GetCookies(OperationContext.Current);
                } catch (EndpointNotFoundException enfe) {
                    Console.WriteLine(enfe.Message);
                    if (enfe.InnerException != null && enfe.InnerException.Message != null)
                        Console.WriteLine(enfe.InnerException.Message);
                    return;
                }
            }
    
            if (bLogin) {
                Console.WriteLine("Welcome, " + username + ". You are now logged in.");
    
                GetUserRoles(cookieContainer);
                GetProfileInfo(cookieContainer);
            } else {
                Console.WriteLine("Credentials could not be validated.");
            }
    
        }
    }
    
    class Program {
    
        static void Main(string[] args) {
    
            if (args.Length < 1) {
                Console.WriteLine("Missing command-line arguments: username password [host]");
                return;
            }
            MyServiceTst mst = new MyServiceTst(args);
    
            Console.WriteLine("Press any key to quit.");
            Console.Read();
        }
    
    }
    
    
    
    
  13. Выполните построение проекта.

Доступ к службам приложения

Теперь можно запустить клиентское приложение и использовать службы приложения, которые были предоставлены как часть веб-узла.

Запуск приложения Windows

  1. В командной строке Windows перейдите в каталог консольного приложения.

  2. Введите следующую команду, указав имя и пароль одного из пользователей, созданных ранее в ходе выполнения данного пошагового руководства.

    AppSvcClient.exe <userName> <password>

    Если учетные данные введены верно, то будет выполнена проверка подлинности, и появится доступ к сведениям о ролях и профиле, связанным с пользователем, под которым выполнен вход.

Чтобы запустить приложение в рабочей среде, можно скопировать веб-сайт на компьютер под управлением Windows Server 2008, а затем обратиться к веб-службе из клиента.

ПримечаниеПримечание

Для выполнения этого действия необходимо ознакомиться с задачами администрирования сервера Windows 2008, а также с использованием IIS Manager для управления веб-приложениями.

Запуск веб-приложения в системе Windows Server 2008

  1. На компьютере под управлением Windows Server 2008 следует убедиться в том, что роль веб-сервера установлена на сервере и в службе ролей ASP.NET.

  2. Убедитесь в том, что приложение Microsoft SQL Server Express установлено.

    ПримечаниеПримечание

    Использование SQL Server Express в рабочей среде не рекомендуется.

  3. Скопируйте на сервер каталог WcfApplicationServices и его дочерние каталоги.

  4. С помощью IIS Manager добавьте виртуальный каталог в корневой каталог веб-сайта и присвойте ему псевдоним WcfApplicationServices. 

  5. Установите физический путь WcfApplicationServices равным пути каталога WcfApplicationServices из предыдущего шага.

  6. Преобразуйте виртуальный каталог WcfApplicationServices в приложение.

  7. В проводнике Windows откройте каталог WcfApplicationServices.

  8. Удалите файл журнала SQL Server Express (aspnetdb_log.ldf), который располагается в папке веб-сайта App_Data.

  9. Щелкните каталог WcfApplicationServices\App_Data правой кнопкой мыши, затем выберите команду Свойства и перейдите на вкладку Безопасность.

  10. Нажмите кнопку Изменить.

    Отобразится диалоговое окно Разрешения для папки App_Data.

  11. Нажмите кнопку Добавить.

    Появится диалоговое окно Выбор: пользователи, компьютеры или группы.

  12. Убедитесь в том, что компьютер локального сервера содержится в списке Из этого типа расположения. Если сервер не содержится в списке, щелкните элемент Расположение и выберите локальный сервер.

  13. В текстовом поле введите текст NETWORK SERVICE.

  14. Закройте все открытые диалоговые окна.

    Пул приложений по умолчанию выполняется в учетной записи NETWORK SERVICE. Эта учетная запись должна иметь разрешения на создание файла журнала SQL и на выполнение изменений в файле aspnetdb.mdf.

  15. Откройте браузер на другом компьютере с доступом к серверу и запросите страницу Default.aspx в веб-приложении.

  16. Войдите в одну из созданных ранее в руководстве учетных записей, чтобы проверить корректность работы приложения.

  17. На компьютере сервера запустите средство регистрации ServiceModel (ServiceModelReg.exe), чтобы зарегистрировать службу. В командной строке с повышенными привилегиями введите следующую команду:

    ServiceModelReg.exe -i

    Эта команда регистрирует модель службы и обновляет сопоставления скриптов в IIS для предоставления службы.

  18. На клиентском компьютере выполните следующую команду AppSvcClient.exe, передав имя пользователя, пароль и сервер в качестве третьего аргумента:

    AppSvcClient.exe <userName> <password> <server>

    После выполнения отобразятся те же данные, что и после выполнения программы AppSvcClient.exe на предыдущем шаге.

    Если программа AppSvcClient возвращает ошибку, сравните параметр URL-адреса, переданный в AppSvcClient, с URL-адресом, отображаемым в средстве Svcutil.exe при переходе к файлу WcfApplicationServices/MyAuthenticationSvcWrap.svc. Например, если имя компьютера сервера равно bp0, введите в браузере следующий URL-адрес:

    http://bp0/WcfApplicationServices/MyAuthenticationSvcWrap.svc

    В указаниях по тестированию службы также содержится URL-адрес, необходимый клиентскому приложению.

Данное пошаговое руководство демонстрирует основные принципы доступа к службам приложения ASP.NET из клиентского приложения, которое способно получать и отправлять сообщения в формате SOAP.

В качестве эксперимента можно протестировать различные дополнительные функциональные возможности службы приложения. Ниже приведены некоторые дополнительные рекомендации.

  • Ознакомьтесь с дополнительными сведениями об использовании служб приложений из клиентов .NET Framework. Дополнительные сведения см. в разделе Общие сведения о службах клиентских приложений.

  • Следует также ознакомиться со сведениями о Windows Communication Foundation (WCF) и об обмене данными с клиентом в формате SOAP. Дополнительные сведения см. на веб-узле MSDN в разделе Инфраструктура веб-служб XML.

Чтобы получить общее представление о веб-службах, необходимо следующее:

  • Понимание принципов использования веб-служб. Дополнительные сведения см. в разделе XML Web Service Scenarios.

  • Необходимо ознакомиться с дополнительными сведениями о службах приложений ASP.NET. Дополнительные сведения см. в разделе AuthenticationServiceLogin().

  • Понимание действий, выполняемых при вызове веб-службы. Дополнительные сведения см. в разделе Anatomy of an XML Web Service Lifetime.

Показ: