Windows Communication Foundation/Хостинг WCF-сервиса на IIS

Для описания хостинга WCF-сервиса на IIS рассмотрим пример по шагам.

Пример править

1. Убедитесь, что на вашем компьютере установлен и запущен IIS.

2. Создайте папку для приложения с названием IISHostedCalcService, например, "C:\Temp\IISHostedCalcService\" (далее - "папка приложения"). Для этой папки необходимо дать полный доступ для учётной записи ASP.NET.

3. Используя IIS Manager создайте на Default Web Site новое приложение (в контекстном меню Add Application). В поле "Alias" введите IISHostedCalc, а в поле "Physical Path" полный путь к папке для приложения, в данном случае "C:\Temp\IISHostedCalcService\".

4. В директории приложения ("C:\Temp\IISHostedCalcService\") создайте файл "service.svc". Измените его содержимое на следующий код:

<%@ServiceHost language=c# Debug="true" Service="Microsoft.ServiceModel.Samples.CalculatorService"%>

5. С помощью IIS Manager создайте поддиректорию в директории приложения. Для этого нужно в IISHostedCalc из контекстного меню выбрать Add Virtual Directory, в появившемся окне в поле "Alias" написать App_Code, в поле Physical Path написать "C:\Temp\IISHostedCalcService\App_Code".

6. В папке приложения создайте файл с именем "web.config" и следующим содержимым:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="Microsoft.ServiceModel.Samples.CalculatorService">
        <endpoint address=""
                  binding="wsHttpBinding"
                  contract="Microsoft.ServiceModel.Samples.ICalculator" />
      </service>
    </services>
  </system.serviceModel>
</configuration>

7. В папке "C:\Temp\IISHostedCalcService\App_Code" создайте файл "service.cs" со следующим содержимым:

using System;
using System.ServiceModel;

namespace Microsoft.ServiceModel.Samples
{

    [ServiceContract]
    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);
    }


    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;
        }
    }
}

8. Перезапустите Default Web Site.

9. Для проверки работы WCF-сервиса в браузере наберите http://localhost/IISHostedCalc/Service.svc

Известные проблемы править

  • В случае ошибки "CS0016: Could not write to output file..." необходимо предоставить права на запись (Modify) для учётной записи ASP.NET (пользователь называется NETWORK SERVICE) к папкам:
    • "C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files"
    • "С:\Windows\TEMP\"
  • В случае ошибки "HTTP Error 404.3" возможно потребуется настроить WCF.

Клиент править

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

Конфигурационный файл будет выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <client>
      <endpoint address ="http://localhost/Calculator/Service.svc"
                binding ="wsHttpBinding"
                contract="WCFCalculatorClientTest.ICalculator"/>
    </client>
  </system.serviceModel>
</configuration>

Класс посредника (прокси-класс):

using System.ServiceModel;

namespace WCFCalculatorClientTest
{
    [ServiceContract]
    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);
    }

    public class Calculator : ClientBase<ICalculator>, ICalculator
    {
        public double Add(double n1, double n2)
        {
            return Channel.Add(n1, n2);
        }

        public double Subtract(double n1, double n2)
        {
            return Channel.Subtract(n1, n2);
        }

        public double Multiply(double n1, double n2)
        {
            return Channel.Multiply(n1, n2);
        }

        public double Divide(double n1, double n2)
        {
            return Channel.Divide(n1, n2);
        }
    }
}

Код тестирования:

using System;

namespace WCFCalculatorClientTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Client started");
            var n1 = ReadInt();
            var n2 = ReadInt();
            var calc = new Calculator();
            Console.WriteLine("{0} + {1} = {2}", n1, n2, calc.Add(n1, n2));
            Console.WriteLine("{0} - {1} = {2}", n1, n2, calc.Subtract(n1, n2));
            Console.WriteLine("{0} * {1} = {2}", n1, n2, calc.Multiply(n1, n2));
            Console.WriteLine("{0} / {1} = {2}", n1, n2, calc.Divide(n1,n2));
            Console.ReadKey();
        }

        static int ReadInt()
        {
            var result = 0;
            while (!int.TryParse(Console.ReadLine(), out result))
            {
                Console.WriteLine("Неверно введено число");
            }
            return result;
        }
    }
}


Ссылки править