Подтвердить что ты не робот

WCF - Название контракта не найдено в списке контрактов

Я относительно новичок в 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.

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

Спасибо

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

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

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

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

  <service name="CustomerSearch" behaviorConfiguration="ServiceBehavior">
  <endpoint address="" binding="webHttpBinding" contract="ICustomerSearch" 
            behaviorConfiguration="ServiceAspNetAjaxBehavior">

Ответ 4

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

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

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

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

<services>
    <service name="RfsProcessor">

Ответ 5

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

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

Ответ 6

У меня была эта ошибка перед средой ServiceModel 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, но IT 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();
    }
}