Активация NamedPipe

В примере NamedPipeActivation показана служба, использующая службу активации процесса Windows (WAS) для активации службы, которая взаимодействует через именованные каналы. Этот пример основан на Начале работы и для работы требуется Windows Vista.

Замечание

Инструкции по настройке и сборке этого примера находятся в конце этого раздела.

Детали образца

Пример состоит из клиентской консольной программы (.exe) и библиотеки служб (.dll), размещенной в рабочем процессе, активированном службами активации Windows (WAS). Действие клиента отображается в окне консоли.

Служба реализует контракт, определяющий шаблон связи с запросом и ответом. Контракт определяется интерфейсом ICalculator , который предоставляет математические операции (добавление, вычитание, умножение и деление), как показано в следующем примере кода.

[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples")]
public interface ICalculator
{
    [OperationContract]
    double Add(double n1, double n2);
    [OperationContract]
    double Subtract(double n1, double n2);
    [OperationContract]
    double Multiply(double n1, double n2);
    [OperationContract]
    double Divide(double n1, double n2);
}

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

// Service class that implements the service contract.
public class CalculatorService : ICalculator
{
    public double Add(double n1, double n2)
    {
        return n1 + n2;
    }
    public double Subtract(double n1, double n2)
    {
        return n1 - n2;
    }
    public double Multiply(double n1, double n2)
    {
        return n1 * n2;
    }
    public double Divide(double n1, double n2)
    {
        return n1 / n2;
    }
}

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

Если вы хотите использовать безопасную привязку именованных каналов, измените режим безопасности сервера на нужный параметр безопасности и снова запустите svcutil.exe на клиенте, чтобы получить обновленный файл конфигурации клиента.

<system.serviceModel>
        <services>
            <service name="Microsoft.ServiceModel.Samples.CalculatorService"
               behaviorConfiguration="CalculatorServiceBehavior">

        <!-- This endpoint is exposed at the base address provided by host: net.pipe://localhost/servicemodelsamples/service.svc  -->
        <endpoint address=""
                  binding="netNamedPipeBinding"
                  bindingConfiguration="Binding1"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
        <!-- the mex endpoint is exposed at net.pipe://localhost/servicemodelsamples/service.svc/mex -->
        <endpoint address="mex"
                  binding="mexNamedPipeBinding"
                  contract="IMetadataExchange" />
      </service>
        </services>
        <bindings>
            <netNamedPipeBinding>
                <binding name="Binding1" >
                    <security mode = "None">
                    </security>
                </binding >
            </netNamedPipeBinding>
        </bindings>

    <!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
    <behaviors>
      <serviceBehaviors>
        <behavior name="CalculatorServiceBehavior">
          <serviceMetadata />
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

  </system.serviceModel>

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

<system.serviceModel>

    <client>
      <endpoint name=""
                          address="net.pipe://localhost/servicemodelsamples/service.svc"
                          binding="netNamedPipeBinding"
                          bindingConfiguration="Binding1"
                          contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </client>

    <bindings>

      <!--  Following is the expanded configuration section for a NetNamedPipeBinding.
            Each property is configured with the default value. -->

      <netNamedPipeBinding>
        <binding name="Binding1"
                         maxBufferSize="65536"
                         maxConnections="10">
          <security mode = "None">
          </security>
        </binding >

      </netNamedPipeBinding>
    </bindings>

  </system.serviceModel>

При запуске примера запросы и ответы операции отображаются в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714

Press <ENTER> to terminate client.

Настройка, сборка и запуск примера

  1. Убедитесь, что установлен IIS 7.0. Служба IIS 7.0 требуется для активации WAS.

  2. Убедитесь, что вы выполнили процедуру настройкиOne-Time для образцов Windows Communication Foundation.

    Кроме того, необходимо установить компоненты активации WCF, отличные от HTTP:

    1. В меню "Пуск " выберите панель управления.

    2. Выберите программы и компоненты.

    3. Нажмите кнопку "Включить" или "Отключить компоненты Windows".

    4. Разверните узел Microsoft .NET Framework 3.0 и проверьте функцию активации Windows Communication Foundation без HTTP.

  3. Настройте службу активации процессов Windows (WAS) для поддержки активации именованных каналов.

    Для удобства следующие два шага реализованы в пакетном файле с именем AddNetPipeSiteBinding.cmd, расположенном в примере каталог.

    1. Для поддержки активации net.pipe веб-сайт по умолчанию должен быть привязан к протоколу net.pipe. Это можно сделать с помощью appcmd.exe, установленной с набором инструментов управления IIS 7.0. В командной строке с повышенными привилегиями (администратор) выполните следующую команду.

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site"
      -+bindings.[protocol='net.pipe',bindingInformation='*']
      

      Замечание

      Эта команда представляет собой одну строку текста.

      Эта команда добавляет привязку сайта net.pipe к веб-сайту по умолчанию.

    2. Хотя все приложения на сайте совместно используют общую привязку net.pipe, каждое приложение может включить поддержку net.pipe по отдельности. Чтобы включить net.pipe для приложения /servicemodelsamples, выполните следующую команду из командной строки с повышенными привилегиями.

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http,net.pipe
      

      Замечание

      Эта команда представляет собой одну строку текста.

      Эта команда позволяет приложению /servicemodelsamples получать доступ с помощью обоих http://localhost/servicemodelsamples и net.tcp://localhost/servicemodelsamples.

  4. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

  5. Удалите привязку сайта net.pipe, добавленную для этого примера.

    В качестве удобства следующие два шага реализуются в пакетном файле с именем RemoveNetPipeSiteBinding.cmd, расположенном в примере каталога:

    1. Удалите net.tcp из списка включенных протоколов, выполнив следующую команду из командной строки с повышенными привилегиями.

      %windir%\system32\inetsrv\appcmd.exe set app "Default Web Site/servicemodelsamples" /enabledProtocols:http
      

      Замечание

      Эта команда должна быть введена в виде одной строки текста.

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

      %windir%\system32\inetsrv\appcmd.exe set site "Default Web Site" --bindings.[protocol='net.pipe',bindingInformation='*']
      

      Замечание

      Эта команда должна быть введена в виде одной строки текста.

См. также