Размещение удаленных объектов в службах IIS

Этот раздел относится к технологии прежних версий, которая сохраняется для обеспечения обратной совместимости с существующими приложениями и не рекомендуется для разработки новых приложений. Сейчас распределенные приложения следует создавать с помощью  Windows Communication Foundation (WCF).

Чтобы разместить удаленный объект в службах IIS, необходимо настроить удаленный объект. Обычно это делается с помощью файла конфигурации или программным образом в коде основного приложения. При размещении удаленного объекта в службах IIS можно либо поместить сведения о конфигурации файл Web.config, либо программным образом настроить удаленный объект в методе Application_Start в файле Global.asax.

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

  • поместите сведения о конфигурации в файл Web.config в выбранном виртуальном каталоге IIS;.

  • поместите реализацию удаленного типа в каталог \bin (или воспользуйтесь инструментом глобального кэша сборок (Gacutil.exe), чтобы разместить ее в глобальном кэше сборок).

При использовании файла Web.config не поддерживаются следующие функции:

  • задание имени приложения; роль имени приложения выполняет виртуальный каталог;

  • использование элемента <debug> в файле Web.config, используемом для настройки удаленного взаимодействия .NET;

  • использование каналов, отличных от HttpChannel;

  • использование файла Web.config и элемента <client> для автоматической настройки клиентского веб-приложения. Если требуется использовать службы IIS в качестве клиента удаленного взаимодействия, необходимо вызвать метод RemotingConfiguration.Configure в методе Application_Start в файле Global.asax.

Файл Web.config по-прежнему содержит базовые сведения о типе, которые должны иметься в системе, но некоторые объявления необходимо немного изменить, чтобы они соответствовали среде размещения. Например, можно задать пользовательские параметры для конкретного канала HttpChannel, но не следует задавать для него номер порта; если ASP.NET создаст еще один домен приложения для обработки нагрузки, из-за конфигурации удаленного взаимодействия этот новый домен приложения будет ожидать передачи данных через тот же порт, что приведет к появлению исключения. Например, файл Web.config для удаленного объекта .NET, размещенного в службах IIS, может выглядеть, как следующий пример кода. В данном случае нет необходимости включать строки конфигурации канала, если только не требуется задать свойства канала (в данном случае свойство priority).

<configuration>
   <system.runtime.remoting>
      <application>
         <service>
            <wellknown 
               mode="Singleton" 
               type="ServiceClass, ServiceClassAssemblyName"
                objectUri="ServiceClass.rem"
            />
         </service>
         <channels>
            <channel 
               name="MyChannel" 
               priority="100" 
               ref="http"
            />
         </channels>
      </application>
   </system.runtime.remoting>
</configuration>
y0hedwet.note(ru-ru,VS.100).gifПримечание
Не задавайте порт для указанных здесь каналов. Если приложение должно ожидать передачи данных через определенный порт, с помощью диспетчера интернет-служб настройте службы IIS, чтобы они ожидали передачи данных через этот порт. Настраиваемый канал автоматически используется дл обработки удаленных запросов, переданных через этот порт.

Для успешного размещения в службах IIS объектов, активируемых сервером (<wellknown>), требуется универсальный код ресурса (URI), который заканчивается на rem или soap. Это требование не распространяется на другие домены основных приложений. Если для создания метаданных для активируемого сервером объекта, размещенного в службах IIS, используется средство Soapsuds (Soapsuds.exe), то URL-адрес передается в качестве аргумента программе Soapsuds.exe следующим образом:

http://< Computer >:< Port >/< VirtDir >/< ObjectURI >?wsdl

Для активируемых клиентом объектов, которые размещаются в службах IIS или в другом домене приложения, универсальный код ресурса (URI) не требуется ни в какой форме. URL-адрес передается в качестве аргумента программе Soapsuds.exe следующим образом:

http://< Computer >:< Port >/< VirtDir >/RemoteApplicationMetadata.rem?wsdl

Программная настройка в службах IIS осуществляется с помощью страницы Global.asax. В следующем примере демонстрируется конфигурация, показанная в предыдущем файле конфигурации, но реализованная с помощью файла Global.asax.

<%@ Application Language="VB" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>

Sub Application_Start()
   Dim props = New Hashtable() As IDictionary
   props("name") = "MyChannel" 
   props("priority") = "100" 
   ' Nothing entries specify the default formatters.
   Dim channel As New HttpChannel( _
      props, _
      Nothing, _
      Nothing _
   )
   ChannelServices.RegisterChannel(channel)
   Dim WKSTE As New WellKnownServiceTypeEntry( _
      GetType(ServiceClass), _
      "HttpService", _
      WellKnownObjectMode.SingleCall
   )
   RemotingConfiguration.RegisterWellKnownServiceType(WKSTE)
End Sub
<%@ Application Language="C#" %>
<%@ Assembly Name="Server" %>
<%@ Import Namespace="System.Runtime.Remoting" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels" %>
<%@ Import Namespace="System.Runtime.Remoting.Channels.Http" %>
<%@ Import Namespace="Server" %>
void Application_Start(){
   IDictionary props = new Hashtable();
   props["name"] = "MyChannel";
   props["priority"] = "100";
   // Null entries specify the default formatters.
   HttpChannel channel = new HttpChannel(
      props, 
      null, 
      null
   );
   ChannelServices.RegisterChannel(channel);
   WellKnownServiceTypeEntry WKSTE = new WellKnownServiceTypeEntry(
      typeof(ServiceClass),
      "HttpService", 
      WellKnownObjectMode.SingleCall
   );
   RemotingConfiguration.RegisterWellKnownServiceType(WKSTE);
} 

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

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
      <compilation>
        <assemblies>
          <add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
        </assemblies>
      </compilation>
  </system.web>
</configuration>

Полный пример см. в разделе Пример удаленного взаимодействия. Размещение в службах IIS.

Использование SSL-сертификатов при удаленном взаимодействии .NET

Сертификаты позволяют идентифицировать конкретный компьютер, имя которого содержится в общем имени сертификата. Тем не менее очень легко изменить имя компьютера или использовать имя "localhost" в файлах конфигурации клиента, в результате чего возникнет расхождение между клиентом и общим именем в сертификате сервера. В .NET Framework версии 1.0 это расхождение игнорируется, а вызов реализуется на сервере.

Начиная с .NET Framework версии 1.1 это расхождение вызывает следующее исключение: "System.Net.WebException. Базовое соединение закрыто: не удалось установить доверительные отношения с удаленным сервером.". Если настроить удаленный клиент на использование общего имени сертификата не удается, можно переопределить расхождение, воспользовавшись следующими параметрами в файле конфигурации клиентского приложения:

<system.net>
   <settings>
      <servicePointManager
         checkCertificateName="true"
      />
   </settings>
</system.net>

Чтобы клиент программным образом игнорировал расхождение имен в сертификате, он должен создать экземпляр класса, реализующего интерфейс ICertificatePolicy и метод CheckValidationResult, который будет возвращать значение true, если значение certificateProblem равно 0x800c010f. После этого можно зарегистрировать объект в объекте System.Net.ServicePointManager, передав его в свойство ServicePointManager.CertificatePolicy. Следующий пример кода является соответствующей реализацией на языке Visual Basic:

Public Class MyPolicy Implements ICertificatePolicy 
   Public Function CheckValidationResult(srvPoint As ServicePoint, certificate As X509Certificate, request As WebRequest, certificateProblem As Integer) As Boolean
      ' Check for policy common name mismatch. 
       If certificateProblem = 0 Or certificateProblem = &H800b010f Then
         Return True
      Else
         Return False
      EndIf
   End Function
End Class
public class MyPolicy : ICertificatePolicy {
   public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate certificate, WebRequest request, int certificateProblem) {
      // Check for policy common name mismatch. 
      if (certificateProblem == 0 || certificateProblem == 0x800b010f)
         return true;
      else
         return false; 
   }
}

Следующий код регистрирует экземпляр описанного выше класса в объекте System.Net ServicePointManager:

System.Net.ServicePointManager.CertificatePolicy = New MyPolicy()
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();

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

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

Требуемый результат Параметры конфигурации Комментарии

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

На сервере в службах IIS выберите Встроенная проверка подлинности Windows и снимите флажок Анонимный доступ.

На клиенте установите параметр useDefaultCredentials равным true.

Это поведение по умолчанию в версии 1.0 платформы .NET, если параметр useDefaultCredentials имеет значение true.

Это поведение поддерживается в версии 1.1 платформы .NET Framework, если параметр useAuthenticatedConnectionSharing также имеет значение false.

Сервер проверяет подлинность клиента один раз, используя учетные данные клиента по умолчанию; последующие вызовы от данного клиента используют подключение, ранее прошедшее проверку подлинности.

На сервере в службах IIS выберите Встроенная проверка подлинности Windows и снимите флажок Анонимный доступ.

На клиенте установите параметр useDefaultCredentials равным true.

Это поведение поддерживается только в платформе .NET Framework версии 1.1 и более поздних версий.

Сервер проверяет подлинность клиента один раз, используя пользовательские или явным образом заданные учетные данные клиента; последующие вызовы от данного клиента используют подключение, ранее прошедшее проверку подлинности.

На сервере в службах IIS выберите Встроенная проверка подлинности Windows и снимите флажок Анонимный доступ.

На клиенте установите параметр credentials равным реализации ICredentials или задайте явные значения параметров username, password и domain. В обоих случаях необходимо также установить параметр unsafeAuthenticatedConnectionSharing равным true и задать значение connectionGroupName, которое соответствует только одному прошедшему проверку подлинности пользователю.

Это поведение поддерживается только в платформе .NET Framework версии 1.1 и более поздних версий.

См. также

Справочник

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

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

URL-адреса активации
Конфигурация удаленных приложений
Пример удаленного взаимодействия. Размещение в службах IIS