WCF - Название контракта не найдено в списке контрактов - PullRequest
39 голосов
/ 16 января 2010

Я относительно новичок в WCF. Однако мне нужно создать сервис, который предоставляет данные как для клиентских приложений Silverlight, так и для AJAX. Пытаясь достичь этого, я создал следующий сервис в качестве доказательства концепции:

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")]
public interface IJsonService
{
    [OperationContract]
    [WebInvoke(Method = "GET",
               RequestFormat=WebMessageFormat.Json,
               ResponseFormat = WebMessageFormat.Json)]
    List<String> JsonFindNames();
}

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")]
public interface IWsService
{
    [OperationContract(Name="FindNames")]
    List<String> WsFindNames();
}


[ServiceBehavior(Name="myService", Namespace="urn:MyCompany.MyProject.Services")]
public class myService : IJsonService, IWsService
{
    public List<String> JsonFindNames() 
        { return FindNames(); }
    public List<String> WsFindNames()
        { return FindNames(name); }
    public List<string> FindNames()
    { 
       List<string> names = List<string>(); 
       names.Add("Alan");
       names.Add("Bill");
       return results; 
    }        
}

Когда я пытаюсь получить доступ к этой услуге, я получаю следующую ошибку:

Не удалось найти название контракта myService в списке контрактов, реализованных сервисом myService.

В чем причина этого? Как мне это исправить?

Спасибо

Ответы [ 6 ]

59 голосов
/ 17 января 2010

Ваш контракт - это интерфейс, а не реализация.

Где-то в конфиге вы написали myService вместо IJsonService.

10 голосов
/ 19 февраля 2015

Удалить пространство имен из имени службы. Это будет работать нормально.

3 голосов
/ 27 апреля 2015

Измените ваш web.config Вы можете найти тег <services> и ниже этого тега у вас должно быть два других тега:

<service .... А также <endpoint ....

В теге <endpoint> вы должны ссылаться на интерфейс вашего класса.

Например: если ваш класс обслуживания с именем CustomerSearch и интерфейс с именем ICustomerSearch, вы должны настроить его следующим образом:

  <service name="CustomerSearch" behaviorConfiguration="ServiceBehavior">
  <endpoint address="" binding="webHttpBinding" contract="ICustomerSearch" 
            behaviorConfiguration="ServiceAspNetAjaxBehavior">
1 голос
/ 25 апреля 2016

У меня раньше была эта ошибка для ServiceModel Framework 3.5, и я проверил файл конфигурации моего хоста. Я обнаружил, что это была моя ошибка вырезать и вставить. Мой сервис указывал на старый несуществующий сервис, чем тот, который я использую. Он снова начинает работать после того, как я исправил эти строки, как показано ниже:

<system.serviceModel>
<services>
  <!--<service name="NotUsed.Serv">-->
  <service name="InUse.MyService">
    <host>
      <baseAddresses>
        <!--<add baseAddress="http://localhost:8181/LastService" />-->
        <add baseAddress="http://localhost:8181/InUseService"/>
      </baseAddresses>
    </host>
  </service>
</services>
</system.serviceModel>

Обратите внимание, что MyService должен быть именем вашего класса контракта в ServiceModel 3.5, НО ЭТО IMyService интерфейс контракта в Framework 4.0 ->

namespace InUse {
[ServiceContract]
public interface IMyService 
{
    [WebGet(UriTemplate = "/GetList/{PATTERN}",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    List<string> GetIDListByPattern(string PATTERN);

}

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]    
public class MyService : IMyService
{        
    List<string> MySample = (new _PointRT()).Sample().Select(r=>r._pointXID).ToList();

    public List<string> GetIDListByPattern(string PATTERN) {
        return MySample.Where(x => x.Contains(PATTERN)).ToList();
    }
}
1 голос
/ 26 ноября 2014

У меня была та же проблема, но мое решение состояло в том, что в моем web.config я указывал полное имя класса (включая пространство имен), тогда как WCF принимал только имя класса.

Это не сработало:

<services>
    <service name="BusinessServices.Web.RfsProcessor">

Это сработало:

<services>
    <service name="RfsProcessor">
0 голосов
/ 04 февраля 2016

В файле web.config атрибут name элемента <service должен быть именем типа службы с пространством имен, но не сборкой (Namespace1.Namespace2.Class).Атрибут contract элемента <endpoint аналогично имеет тип интерфейса с указанием пространства имен - Namespace1.Namespace2.Interface.

Это также решает все поведенческие махинации, например, CreateBehavior не вызывается на BehaviorExtensionElement.

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