• Авторизация


WCF часть 1 10-12-2009 18:44 к комментариям - к полной версии - понравилось!


Решил вспомить WCF .NET. Перерыл пол инета все примеры через конфиг файл приложения. Это удобно но недостаточно гибко. Тем более что в крупном проектк придется делать полностью руками, не пологаясь на самогенерируемый код...

Не нашел, но есть же MSDN. Там пример сервер-клиент приложения - калькулятора. Клиент автогенерируемый. =(

Ну при построение клиент-серверного приложения в первую очередь важен сервер! Посему начал с сервера а клиент на сладкое.
Для начала необходимо реализовать контракт клиент-серверных взаимоотношений. Я решил для теста написать клиент серверное приложение передающее командную строку по числовому запросу.

Допустим:
1 - Старт
0 - Стоп
2-... - Какая-то команда

Перейдем к реализации сервиса.
Вначале реализуется интерфейс к которому будет иметь доступ клиент и сервер.
code:

using System.ServiceModel;

namespace CommunicationInterface
{
[ServiceContract] // Говорим WCF что это интерфейс для запросов сервису
public interface IMyObject
{
[OperationContract] // Делегируемый метод.
string GetCommandString(int i);
}
}



Соответственно на сервере должна быть его реализация.
code:

namespace CommunicationInterface
{
public class MyObject: IMyObject
{
public string GetCommandString(int i)
{
switch (i)
{
case 1:
return "Start command";

case 0:
return "Stop command";

default:
return "Command " + i.ToString();
}
}
}
}



Теперь перейдем к основной части: реализация сервера.
В данном примере сервер будет консольным приложением.
Начнем с того что объясним WCF какой объект будет отвечать за функционал сервера и по какому адресу\протоколу будет происходить обращение. Для начала возьмем http Создаем хост по адресу "http://localhost:1050/TestService" и говорим WCF что при получение запроса для его обработки надо создать экзэмпляр сервис-класса "MyObject"

ServiceHost host = new ServiceHost(typeof(MyObject), new Uri("http://localhost:1050/TestService"));

Теперь надо объяснить WCF что запрос http и какой интерфейс предоставляется клиенту по запросу.

host.AddServiceEndpoint(typeof(IMyObject), new BasicHttpBinding(), "");


code:

using System;
using System.ServiceModel;
using CommunicationInterface;

namespace Server
{
class Program
{
static void Main(string[] args)
{
ServiceHost host = new ServiceHost(typeof(MyObject), new Uri("http://localhost:1050/TestService"));
host.AddServiceEndpoint(typeof(IMyObject), new BasicHttpBinding(), "");
host.Open();
Console.WriteLine("Start service...");
Console.ReadLine();

host.Close();
}
}
}



Теперь клиент. MSDN предлагает средствами специальной утилы обратиться к сервису, опросить его функционал и автоматически сгенерировать интерфейс доступа. Код как обычно в таких случиях получается грамоздкий, да и реально не очень удобный...
Потом если делать приложение c возможностями callback то этот вариант вообще не приемлем... В итоге клиент реализуем руками.
Начнем с того что зададим адрес где висит сервис:

Uri tcpUri = new Uri("http://localhost:1050/TestService");
EndpointAddress address = new EndpointAddress(tcpUri);

Далее надо создать канал для доступа к экземпляру сервиса. Не забываем указать что используется http


ChannelFactory factory = new ChannelFactory(new BasicHttpBinding(), address);

Открываем канал и получаем доступ через наш интерфей к экземпляру созданному на сервер.

IMyObject service = factory.CreateChannel();


Таким образом получаем клиент:
code:

using System;
using System.ServiceModel;


namespace Client
{
[ServiceContract]
public interface IMyObject
{
[OperationContract]
string GetCommandString(int i);
}

class Program
{
static void Main(string[] args)
{
Uri tcpUri = new Uri("http://localhost:1050/TestService");
EndpointAddress address = new EndpointAddress(tcpUri);
BasicHttpBinding binding = new BasicHttpBinding();
ChannelFactory factory = new ChannelFactory(binding, address);
IMyObject service = factory.CreateChannel();

Console.WriteLine("Call service method...");
Console.WriteLine(service.GetCommandString(1));
Console.WriteLine(service.GetCommandString(2));
Console.WriteLine(service.GetCommandString(0));
Console.ReadLine();
}
}
}



В итоге получилось простейшее клиент-серверное приложение.

[699x437]
вверх^ к полной версии понравилось! в evernote


Вы сейчас не можете прокомментировать это сообщение.

Дневник WCF часть 1 | FANGarh - Дневник FANGarh | Лента друзей FANGarh / Полная версия Добавить в друзья Страницы: раньше»