Читать «ЯЗЫК ПРОГРАММИРОВАНИЯ С# 2005 И ПЛАТФОРМА .NET 2.0. 3-е издание» онлайн - страница 446
Эндрю Троелсен
4. Создайте виртуальный каталог, соответствующий только что созданной вами корневой папке (C:\IISCarService). Остальные значения, предложенные мастером создания виртуального каталога, будут вполне подходящими.
5. Наконец, создайте новый файл конфигураций с именем web.config для настройки параметров регистрации удаленных типов виртуальным каталогом (см. следующий фрагмент программного кода). Сохраните этот файл в соответствующей корневой папке (в данном случае это папка C:\IISCarService).
‹configuration›
‹application›
‹service›
‹wellknown mode="Singleton" type="CarGeneralAsm.CarProvider, CarGeneralAsm" objectUri="carprovider.soap"
‹/service›
‹channels›
‹channel ref="http"/›
‹/channels›
‹/application
‹/configuration›
Теперь файл CarGeneralAsm.dll будет доступен для НТТР-запросов IIS, и вы можете обновить файл *.config на стороне клиента так, как показано ниже (конечно, указав в нем имя своего IIS-хоста).
‹configuration›
‹application›
‹client displayName="CarClient"›
‹wellknown type="CarGeneralAsm.CarProvider, CarGeneralAsm" url="http://NameTheRemoteIISHost/IISCarHost/carprovider.soap"/›
‹/client›
‹channels›
‹channel ref="http"/›
‹/channels›
‹/application›
‹/configuration›
После этого вы сможете выполнять приложение клиента так же, как и раньше.
Асинхронное удаленное взаимодействие
В завершение нашего обсуждения материала данной главы давайте выясним, как вызывать члены удаленного типа асинхронно. В главе 14 была рассмотрена тема асинхронного вызова методов с помощью типов делегата. Как и следует ожидать, при асинхронном вызове удаленного объекта компоновочным блоком клиента первым шагом должно быть определение пользовательского делегата, представляющего соответствующий удаленный метод. После этого вызывающая сторона для вызова метода и получения возвращаемых значений может использовать любой из подходов, описанных в главе 14.
Для примера создайте новое консольное приложение (AsyncWKOCarProvider-Client) и установите в нем ссылку на первый вариант компоновочного блока CarGeneralAsm.dll. Теперь измените класс Program так, как показано ниже:
class Program {
// Делегат для метода GetAllAutos().
internal delegate List‹JamesBondCar› GetAllAutosDelegate();
static void Main(string[] args) {
Console.WriteLine("Старт клиента! Для завершения нажмите ‹Enter›");
RemotingConfiguration.Configure("AsyncWKOCarProviderClient.exe.config");
// Создание поставщика машин.
CarProvider cp = new CarProvider();
// Создание делегата.
GetAllAutosDelegate getCarsDel = new GetAllAutosDelegate(cp.GetAllAutos);
// Асинхронный вызов GetAllAutos().
IAsyncResult ar = getCarsDel.BeginInvoke(null, null);
// Имитация активности клиента.
while (!ar.IsCompleted) { Console.WriteLine("Клиент работает…"); }
// Все сделано! Получение возвращаемого значения делегата.
List‹JamesBondCar allJBCs = getCarsDel.EndInvoke(ar);
// Использование всех машин из списка.