Требует ли клиент, использующий службу WCF, определение интерфейса? - PullRequest
0 голосов
/ 12 декабря 2010

Я изучал книгу «Изучение WCF», пытаясь научиться создавать и использовать веб-сервисы WCF. Первая часть книги знакомит читателя с созданием и использованием простого веб-сервиса «Hello World».

Проблема, с которой я столкнулся, заключается в том, что клиентское приложение, похоже, не знает структуру интерфейса WCF при его вызове. Как это может быть необходимо, если веб-сервис может вызываться с любого количества языков программирования?

Я перечислил соответствующий пример кода ниже ...

Вот код для интерфейса

 [ServiceContract(Namespace="http: //www.thatindigogirl.com/samples/2006/06")]
 public interface IHelloIndigoService
 {
  [OperationContract]
  string HelloIndigo();
 }

Вот код Сервиса, на котором размещается веб-сервис

static void Main(string[] args)
{
  using (ServiceHost host = new ServiceHost(typeof(HelloIndigo.HelloIndigoService) ,
    new Uri("http: //localhost: 8000/HelloIndigo")))
  {
    host. AddServiceEndpoint(typeof(HelloIndigo. IHelloIndigoService) ,
      new BasicHttpBinding(), "HelloIndigoService");
    host. Open( );
    Console. WriteLine("Press <ENTER> to terminate the service host") ;
    Console. ReadLine();
  }
}

Вот код клиентского приложения, которое использует службу WCF Здесь я запутался. Поскольку это клиентское приложение может быть любым языком, способным вызывать веб-сервис, почему необходимо знать определение интерфейса?

using System. ServiceModel;
[ServiceContract(Namespace = "http: //www.thatindigogirl.com/samples/2006/06")]
public interface IHelloIndigoService
{
  [OperationContract]
  string HelloIndigo( );
}

static void Main(string[ ] args)
{
 EndpointAddress ep = new
   EndpointAddress("http: //localhost: 8000/HelloIndigo/HelloIndigoService") ;
 IHelloIndigoService proxy = ChannelFactory<IHelloIndigoService>.
   CreateChannel(new BasicHttpBinding(), ep);

 string s = proxy. HelloIndigo();
 Console. WriteLine(s) ;
 Console. WriteLine("Press <ENTER> to terminate Client.") ;
 Console. ReadLine();
}

Я упустил важный момент здесь? Возможно, мое понимание того, что необходимо для использования сети, отсутствует. Моя цель - использовать WCF для создания службы .NET, которую можно вызывать из любого языка программирования или любой другой среды.

Может ли кто-нибудь предложить хороший учебник по созданию "кроссплатформенных" веб-сервисов из .NET? Спасибо!

Ответы [ 4 ]

2 голосов
/ 13 декабря 2010

«Интерфейс» не означает файл интерфейса .NET, это означает более общий интерфейс программирования - набор объектов со свойствами и методы с параметрами. Это также называется договором на обслуживание.

Причина, по которой клиент и служба должны совместно использовать (т. Е. Оба знают) интерфейс, проста, когда вы думаете об этом - если клиент не знает интерфейс, как они узнают, какие операции доступны и что ожидаемые объекты запроса / ответа должны выглядеть так:

2 голосов
/ 13 декабря 2010

Этот подход основан на разделяемом интерфейсе (книга фактически не разделяет интерфейс, а вместо этого использует локальное копирование) и успешно применяется в среде, где и клиент, и сервер написаны на .NET. Этот подход не применим для взаимодействия или решений SOA.

Другой подход использует метаданные, предоставляемые сервисом. Метаданные определяются как документ WSDL плюс несколько документов XSD. Эти файлы метаданных являются способом предоставления информации о вашей службе разработчикам .NET и не .NET. Книга содержит определение конечной точки метаданных (mex), поэтому вы обязательно прочитаете об этом.

Использование метаданных в .NET означает создание прокси службы. Вы можете сделать это автоматически, используя ссылку на службу Visual Studio или служебную программу командной строки svcutil.exe. В любом случае сгенерированный прокси-код, вероятно, все еще будет содержать интерфейс, созданный из метаданных. Используется для создания прозрачной абстракции сервиса для клиента.

1 голос
/ 13 декабря 2010

Чтобы ответить на ваш вопрос о том, как разрабатывать «кроссплатформенные» веб-сервисы, рассмотрите подход REST. Создание веб-сервисов в стиле REST действительно делает их независимыми от платформы, которая их использует. Проще говоря, они используют уже хорошо зарекомендовавшие себя протоколы HTTP, которые все поддерживают: методы GET и POST Http.

Тогда вы могли бы иметь приложение Java, просто сделав POST-вызовы к вашим службам WCF с вашим собственным пользовательским содержимым XML в полезной нагрузке, не прибегая к более сложным вещам, таким как создание оболочек SOAP и тому подобное. Ознакомьтесь с статьей Роба Бэгби на REST:

http://www.robbagby.com/rest/rest-in-wcf-part-i-rest-overview/

1 голос
/ 13 декабря 2010

Каждый сервис WCF состоит из

  • A - адрес
  • B - переплет
  • C - контракт

Контракт объявляется с использованием интерфейса на стороне сервера. Он объявляет, какие методы доступны клиенту. Если вы используете привязку http, вы можете вызвать операцию службы, отправив запрос http (используя клиент http в любой библиотеке или на любом языке или даже в веб-браузере), указывающий на правильный адрес. Таким образом, клиенту вообще не нужна ссылка на интерфейс. Нужно просто следовать ABC службы.

Здесь - хороший блог о совместимости WCF и Java.

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