Веб-сервис WCF REST: имя контракта не найдено - PullRequest
1 голос
/ 17 июля 2010

Я использую стартовый комплект WCF REST для создания сервиса RESTFul. Я определил услугу так:

namespace MyNS {
  [ServiceBehavior(IncludeExceptionDetailInFaults = true, 
   InstanceContextMode = InstanceContextMode.Single,
   ConcurrencyMode = ConcurrencyMode.Single)]
  [AspNetCompatibilityRequirements(
   RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
  public class MyService : MyCollectionServiceBase, IMyCollectionServiceBase 
  {...}
}

MyCollectionServiceBase и IMyCollectionSeviceBase определены следующим образом:

namespace MyNS.Contract {
  [ServiceContract]
  public interface IMyCollectionServiceBase<TItem> where TItem : class 
  {...}

  // COllectionServiceBase is an abstract class in 
  // Microsoft.ServiceModel.Web.SpecializedServices
  public abstract class MyCollectionServiceBase<TItem> :
    CollectionServiceBase<TItem>
    where TItem : class
  {...}
}

и вот раздел службы в моем Web.config

<serviceBehaviors>
  ...
  <behavior name="MyNS.MyService1Behavior">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
  </behavior>
</serviceBehaviors>
...
<service behaviorConfiguration="MyNS.MyService1Behavior"
  name="MyNS.MyService1">
  <endpoint address="" binding="wsHttpBinding" 
    contract="MyNS.IMyService1">
    <identity>
      <dns value="localhost" />
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>

Когда я тестирую свою службу с помощью "http://localhost:1290/MyService.svc/",, я получаю сообщение об ошибке:

The contract name 'MyNS.Contract.IMyCollectionServiceBase' could not be found 
in the list of contracts implemented by the service 'MyService'.

Я не уверен, что конечная точка не совпадает или что-то отсутствует?

Ответы [ 2 ]

2 голосов
/ 17 июля 2010

Для ознакомления необходимо прочитать статью Введение в службы RESTful с WCF (журнал MSDN, выпуск за январь 2009 г.).

Ваша текущая конфигурация службы использует wsHttpBinding, что не REST (но вместо SOAP) - вам не нужно использовать webHttpBinding вместо.

Кроме того, чтобы иметь службу RESTful, вам необходимо украсить операции службы атрибутом [WebGet] или [WebInvoke] и дополнительно указать параметры, определяющие, как именно должен вызываться HTTP-URI и как он должен реагировать.

1 голос
/ 17 июля 2010

Возвращаете ли вы абстрактный класс или интерфейс из одной из ваших служебных операций?Если это так, рассмотрите возможность добавления атрибута ServiceKnownType в определение операции службы (в вашем интерфейсе), которая делает это.

[OperationContract()]
[WebGet(...)]
[ServiceKnownType(typeof(IMYCollectionServiceBase))]
IWhatever MyServiceOperation(...);

Если это не так, обновите ваше сообщение с настройками web.config.

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