Ответ 1
Ваш контракт - это интерфейс, а не реализация.
Где-то в конфиге вы написали myService вместо IJsonService.
Я относительно новичок в 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.
В чем причина этого? Как это исправить?
Спасибо
Ваш контракт - это интерфейс, а не реализация.
Где-то в конфиге вы написали myService вместо IJsonService.
Удалите пространство имен из имени службы. Он будет работать нормально.
Измените свой web.config
Вы можете найти тег <services>
и ниже этого тега, у вас должен быть еще два тега:
<service ....
А также
<endpoint ....
В теге <endpoint>
вы должны ссылаться на интерфейс вашего класса.
Например: если ваш класс обслуживания с именем CustomerSearch
и ваш интерфейс с именем ICustomerSearch
, вам нужно выполнить следующие настройки:
<service name="CustomerSearch" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="webHttpBinding" contract="ICustomerSearch"
behaviorConfiguration="ServiceAspNetAjaxBehavior">
У меня была такая же проблема, но я решил, что в моем web.config я указывал имя всего класса (включая пространство имен), тогда как WCF принимал только имя класса.
Это не сработало:
<services>
<service name="BusinessServices.Web.RfsProcessor">
Это сработало:
<services>
<service name="RfsProcessor">
В файле web.config
атрибут <service
element name
должен быть именем типа службы с пространством имен, но не сборкой (Namespace1.Namespace2.Class
). Атрибут <endpoint
element contract
аналогичным образом имеет тип интерфейса с пространством имен - Namespace1.Namespace2.Interface
.
Это также разрешает все махинации поведения, например CreateBehavior
не вызывает на BehaviorExtensionElement
.
У меня была эта ошибка перед средой 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();
}
}