2010-04-26 4 views
2

Я новичок в WCF и пытаюсь получить некоторые идеи, которые у меня есть с земли.Конфигурация для WCF с несколькими конечными точками

В принципе у меня есть проект веб-приложений WCF со следующим в web.config:

<system.serviceModel> 
    <services> 
     <service name="WcfService1.ServiceContract.IDirectorySearchService" behaviorConfiguration="defaultServiceBehavior"> 
      <endpoint name="restxml" address="xml" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceXml" behaviorConfiguration="xmlRestBehavior"/> 
      <endpoint name="restjson" address="json" binding="webHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchServiceJson" behaviorConfiguration="jsonRestBehavior"/> 
      <endpoint name="soap" address="soap" binding="basicHttpBinding" contract="WcfService1.ServiceContract.IDirectorySearchService"/> 
      <endpoint name="mex" address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="defaultServiceBehavior"> 
       <serviceDebug includeExceptionDetailInFaults="true"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="xmlRestBehavior"> 
       <webHttp/> 
      </behavior> 
      <behavior name="jsonRestBehavior"> 
       <enableWebScript/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

Мои интерфейсы выглядеть следующим образом:

[ServiceContract] 
public interface IDirectorySearchServiceXml 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "Search/")] 
    SearchResults Search(); 
} 

[ServiceContract] 
public interface IDirectorySearchServiceJson 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "Search/")] 
    SearchResults Search(); 
} 

[ServiceContract] 
public interface IDirectorySearchService 
{ 
    [OperationContract] 
    SearchResults Search(int? sportId, int? instituteId, DateTime? startDate, DateTime? endDate); 
} 

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

Приветствия Энтони

UPDATE:

Так что если у меня есть что-то вроде следующего, я должен был бы 3 различных SVC файлов ... Если это так, то нет особого смысла в том, адресная часть в конечной точке ...

public class DirectorySearchServiceXml : IDirectorySearchServiceXml 
{ 
    ... 
} 

public class DirectorySearchServiceJson : IDirectorySearchServiceJson 
{ 
    ... 
} 

public class DirectorySearchService : IDirectorySearchService 
{ 
    ... 
} 

Но я мог бы создать 1 класс, exsplictly implments все 3 интерфейса, то я бы только 1 SVC, а затем адрес становится Релевент ... Является ли это правильно?

+0

Да, если у вас есть ** три класса **, которые реализуют контракт на обслуживание, вам необходимо ** три файла SVC **. Если у вас есть только один класс **, реализующий все три интерфейса, то вам нужен ** один SVC-файл ** - один SVC-файл для каждого класса, который реализует ваши контракты. –

+0

Я сделал один класс, реализующий все три интерфейса, и я получаю следующая ошибка: «Сервис» WcfService1.Service.DirectorySearchService имеет нулевые конечные точки приложения (не инфраструктура). Возможно, это связано с тем, что файл конфигурации не найден для вашего приложения или из-за того, что ни один элемент службы, соответствующий имени службы, не может быть найден в конфигурации файл или потому, что в элементе службы не было определено никаких конечных точек ». есть идеи? Моя конфигурация такая же, как и выше, и svc выглядит как <% @ ServiceHost Language = "C#" Debug = "true" Service = "WcfService1.Service.DirectorySearchService"%> –

+0

, а URL-адрес, который я использую, - "http: // localhost: 16089/DirectorySearchService.svc/mex " –

ответ

2

Это зависит :-)

Если вы хотите разместить свои WCF службы в IIS (проверьте MSDN How To: Host a WCF Service in IIS), как я полагаю, из вашего вопроса, то вам нужны три вещи:

  • виртуальный каталог (и, возможно, подкаталог его), где вы кладете файл службы (yourservice.svc) в
  • сервисный файл - короткий однострочник
  • соответствующий конфигурационный раздел в вашем файле web.config

Сервисный файл (* .svc) - это всего лишь крошечный текстовый файл с одной строкой, чтобы проинструктировать IIS о том, как создать службу. Это выглядит следующим образом:

<%@ServiceHost language=c# Debug="true" 
       Service="Microsoft.ServiceModel.Samples.CalculatorService"%> 

Атрибут language определяет язык службы WCF, debug включает отладку (для разработчика и тестирования, отключить его для производства), а Service= определяет, какой класс (полное с пространством имен и все) на самом деле реализует ваши услуги.

Далее вам необходимо поместить эти сервисные реализации в файл с кодом * .svc (не рекомендуется) или, что гораздо лучше, скомпилировать вашу реализацию службы WCF в библиотеку классов и вставить эту библиотеку классов в .\bin в вашем виртуальном каталоге.

И, в конце концов, вам нужна соответствующая конфигурация на сервере server.config на стороне сервера - из того, что я могу сказать, у вас уже есть это на месте, и я думаю, что все должно быть хорошо.

Ваши адреса услуг будет определяться сервером

  • виртуального каталога (и возможно подкаталоги)
  • файл сервис сам

и любые дополнительные настройки, которые вы могли бы иметь в ваш конфиг для отдельных конечных точек обслуживания.

Так что в вашем случае, вы бы

  • http://yourserver:port/YourVirtualDirectory/YourService.svc/restxml
  • http://yourserver:port/YourVirtualDirectory/YourService.svc/restjson
  • http://yourserver:port/YourVirtualDirectory/YourService.svc/soap

для вещественных функций, а * http://yourserver:port/YourVirtualDirectory/YourService.svc/mex для обмена метаданными (который вам не будет использоваться напрямую).

+0

Спасибо за отзыв ... большой вопрос, который у меня есть, для интерфейсов, которые у меня есть, и конфигурации, которую я хочу, что мне нужно svc и каковы их имена? Мне нужен только 1 svc, который указывает на службу по умолчанию? –

+0

@vdh_ant: вам нужен ** один SVC-файл для каждого класса услуг **, который у вас есть. Если у вас есть один класс услуг, который реализует все три контракта на обслуживание, то вам нужно ** один SVC-файл ** - когда у вас есть три отдельных класса, каждый из которых выполняет один из контрактов на обслуживание, тогда вам нужно ** три SVC-файла ** - по одному на класс обслуживания.То, что вы называете, полностью зависит от вас - независимо от того, что вам нравится - но имейте в виду - имя и расширение .svc станут частью URL вашего сервиса! Не сходите с ума по этим именам .... –

+0

Спасибо за обновление ... Пожалуйста, см. Обновление выше. –

1

У меня также были проблемы с несколькими конечными точками в пределах одной службы. Я всегда получал ошибку 400. Моя ошибка заключалась в том, чтобы не использовать разные адреса в web.config. Поэтому важно, чтобы использовали разные адреса = конфигурации для каждой конечной точки (пример находится в 1-м столбце). Один конечный пункт может опустить его или оставить пустым. Все остальные нуждаются в этом.

0

Просто чтобы добавить к обсуждению.

Я столкнулся с той же проблемой, и я закончил с использованием частичного класса.

Каждая конечная точка может быть реализована с помощью другого интерфейса, как вы это делали, но ваш файл svc относится к одному имени класса, затем вы разбиваете свой класс на частичные классы, а вот умный бит, каждый частичный класс может реализовать разные интерфейс.

Затем вы можете разделить свои реализации и интерфейсы, но все же обойти необходимость в том, чтобы файл svc ссылался на один класс.

Смежные вопросы