Создание бизнес-приложений с помощью Silverlight - Междоменные политики для служб, размещенных внутри IIS

ОГЛАВЛЕНИЕ

Междоменные политики для служб, размещенных внутри IIS

Как обсуждалось ранее, развертывание междоменных политик для размещаемых в IIS служб выполняется просто: достаточно скопировать файл clientaccesspolicy.xml в корневой каталог того узла, на котором размещаются веб-службы. Как вы видели на рис. 1, приложение Silverlight размещается на advcallclientweb (localhost:1041) и получает доступ к бизнес-службам из AdvBusinessServices (localhost:1043). Среде выполнения Silverlight требуется, чтобы файл clientaccesspolicy.xml был помещен в корневой каталог веб-узла AdvBusinessServices с помощью кода, показанного на рис. 9.

Рис. 9 Clientaccesspolicy.xml для веб-служб, размещаемых в IIS

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
  <policy>
  <allow-from http-request-headers="*">
  <!--allows the access of Silverlight application with localhost:1041
  as the domain of origin-->  
  <domain uri="http://localhost:1041"/>
  <!--allows the access of call simulator Silverlight application
  with localhost:1042 as the domain of origin-->  
  <domain uri="http://localhost:1042"/>
  </allow-from>
  <grant-to>
  <resource path="/" include-subpaths="true"/>
  </grant-to>
  </policy>
  </cross-domain-access>
</access-policy>

Если вы помните формат междоменной политики для сервера сокетов (advpolicyserver) из первого выпуска данной серии статей, видно, что формат <allow-from> подобен ему. Различие заключается в разделе <grant-to>, где серверу сокетов требуется настройка <socket-resource> с указанием диапазона портов и атрибутов протокола, как показано ниже.

<grant-to>
  <socket-resource port="4530" protocol="tcp" />
</grant-to>

Если узел для размещения служб WCF создается с помощью шаблона веб-узла ASP.NET, и впоследствии добавляются конечные точки WCF, тестовый веб-сервер включает виртуальный каталог в имя проекта (например «/AdvBusinessServices»). На странице свойств проекта его следует заменить на «/», чтобы файл clientaccesspolicy.xml предоставлялся из корневого каталога. Если не сделать этого изменения, то файл clientaccesspolicy.xml не попадет в корневой каталог, и приложения Silverlight при осуществлении доступа к службе будут получать ошибки сервера. Отмечу, что такой проблемы не возникает при создании веб-узлов с помощью шаблона проекта веб-службы WCF.

Рис. 10 Управление входом в систему с помощью PasswordBox

<UserControl x:Class="AdvCallCenterClient.Login">
  <Border x:Name="LayoutRoot" ... >
  <Grid x:Name="gridLayoutRoot">
  <Border x:Name="borderLoginViw" ...>
  <TextBlock Text="Pleae login.." Style="{StaticResource headerStyle}"/>
  <TextBlock Text="Rep ID" Style="{StaticResource labelStyle}"/>
  <TextBox x:Name="txRepID" Style="{StaticResource valueStyle}"/>
  <TextBlock Text="Password" Style="{StaticResource labelStyle}"/>
  <PasswordBox x:Name="pbPassword" PasswordChar="*"/>
  <HyperlinkButton x:Name="hlLogin" Content="Click to login"  
  ToolTipService.ToolTip="Clik to login" Click="hlLogin_Click" />
  </Border>
  <TextBlock x:Name="tbLoginStatus" Foreground="Red" ... />
  ...
</UserControl>

public partial class Login : UserControl
{
  public Login()
  {
  InitializeComponent();
  }
  public event EventHandler<EventArgs> OnSuccessfulLogin;
  private void hlLogin_Click(object sender, RoutedEventArgs e)
  {
  //validate the login
  AuthenticationProxy.AuthenticationServiceClient authService 
  = new AuthenticationProxy.AuthenticationServiceClient();
  authService.LoginCompleted += new 
  EventHandler< AuthenticationProxy.LoginCompletedEventArgs>
  (authService_LoginCompleted);
  authService.LoginAsync(this.txRepID.Text, this.pbPassword.Password, 
  null, false);  
  }

  void authService_LoginCompleted(object sender, 
  AuthenticationProxy.LoginCompletedEventArgs e)
  {
  if (e.Result == true)
  {
  if (OnSuccessfulLogin != null)
  OnSuccessfulLogin(this, null);
  }
  else
  {
  this.tbLoginStatus.Text = "Invalid user id or password";
  }

  }
}