четверг, 19 июня 2014 г.

Создание клиента WCF сервиса на Xamarin Android.

   Вообще на официальном сайте продукта есть очень хорошая документация почти по всем востребованным фитчам(что является большим плюсом ), которые могут пригодиться в разработке, да и еще с примерами. Вот здесь подробно описано как можно настроить ваше приложение на общение с wcf сервисом.
   Предположим, что у вас уже есть работающий wcf сервис TestService с методом GetData, который хостится локально на iis express и доступен по следующему адресу: http://localhost:9607.По шагам получается следующее:

1.Нужно настроить iis express на принятие удаленных соединений.В файле конфигурации(documents\iisexpress\config\applicationhost.config) находим настройку нашего сервиса и в bindig добавляем привязку по адресу ":9608:192.168.1.143". Получается биндинг TestService теперь выглядит таким образом:

<bindings>  
<binding protocol="http" bindingInformation="*:9607:localhost" />  
<binding protocol="http" bindingInformation="*:9608:192.168.1.143" />  
</bindings>

Далее настраиваем iis express на принятие внешних коннекшионов через порт 9608. Запускаем с правами администратора netsh.exe(C:\Windows\System32) и прописываем команду

> netsh http add urlacl url=http://192.168.1.143:9608/ user=everyone

Если падает из-за "everyone", то вместо прописываем "все". После настраиваем Windows Firewall для принятия внешнего трафика с порта 9608 следующей командой:

netsh advfirewall firewall add rule name="IISExpressXamarin" dir=in protocol=tcp localport=9608 profile=private remoteip=localsubnet action=allow

Теперь TestService будет доступен по обоим адресам:http://localhost:9607.http://192.168.1.143:9608.
Но нам нужен именно этот адрес-http://192.168.1.143:9608.

2. Генерируем прокси класс через утилиту Silverlight Service Model Proxy Generation Tool, которую можно скачать здесь. Запускаем ее через cmd с правами администратора и прописываем следующее


SLsvcUtil.exe /noConfig http://localhost:9607/TestService.svc 

После, полученный файл(прокси класс) TestService.cs добавляем в текущий проект. 

3. Теперь осталась финальная часть-написать класс по инициализации TestService. 
В моем проекте это выглядит примерно таким образом:

public class TestServiceClientApp
{
public static TestServiceClient clientWcf;
public static readonly EndpointAddress EndPoint = new EndpointAddress("http://192.168.1.172:9608/TetService.svc/basic");


public static void Start()
{
if (TestServiceClientApp == null)
InitializeServiceClient ();
}
private static void InitializeServiceClient()
{
BasicHttpBinding binding = CreateBasicHttp();
clientWcf = new TestServiceClient(binding, EndPoint);
clientWcf.GetDataCompleted+=ClientOnCompleted;

}



private static BasicHttpBinding CreateBasicHttp()
{

BasicHttpBinding binding = new BasicHttpBinding { Name = "basicHttpBinding",

MaxReceivedMessageSize = 2147483647,
MaxBufferSize = 2147483647
}; TimeSpan timeout = new TimeSpan(0, 0, 30);
binding.ReceiveTimeout
binding.SendTimeout = timeout; binding.OpenTimeout = timeout; return binding;
}
private static void ClientOnCompleted(object sender, GetDataCompletedEventArgs e)
{
if (e.Error != null)
{
/*do something*/
}
else if (e.Cancelled)
{
/*do something*/
}
else
{
/*get e.Result from TestService*/
}
}
}

Из самого приложения вызываем метод Start(), и после можно обращаться к методам сервиса.
Все методы службы вызываются асинхронно. В ранних версиях студии вызов сервиса не работал, создавался коннект, но получить результат выполнения было невозможно. На момент написания статьи, при выходе Xamarin 5.0 этот баг еще не был исправлен. Для того, чтобы получать данные от службы в нормальном режиме, на сайте https://bugzilla.xamarin.com/ было предложено такое решение:
создаем в корне проекта xml файл System.ServiceModel.xml со следующим содержимым:

<?xml version="1.0" encoding="utf-8" ?> <linker> <assembly fullname="System.ServiceModel"> <type fullname="System.ServiceModel.Channels.ChannelFactoryBase`1"> <method name="CreateChannel" /> </type> </assembly> </linker> После этого служба работала исправно.

Комментариев нет:

Отправить комментарий