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


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

Дятел