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