Ответ 1
[ServiceContract]
отсутствовал в моем случае.
Название контракта "IMyService" не может быть найдено в списке контрактов, реализованных службой "MyService".. --- > System.InvalidOperationException: имя контракта "IMyService" не может быть найдено в списке контрактов реализованный службой "MyService".
Это сводит меня с ума. У меня есть веб-сервис WCF, который работает на моей машине dev, но когда я копирую его на виртуальную машину, которую я использую для тестирования, я получаю ошибку, которая, как представляется, указывает на то, что я не реализую интерфейс, но он не делает потому что служба действительно работает на моем Windows XP IIS. виртуальная машина использует IIS Windows Server 2003. Любые идеи?
Здесь следует отметить, что я получаю эту ошибку на своей виртуальной машине даже при попытке получить доступ к службе в веб-браузере в качестве клиента.
Примечание. Я использую mainPermissionMode = "UseWindowsGroups", но это не проблема на моей локальной машине. Я просто добавляю себя в соответствующую группу окон. Но не повезло на моей виртуальной машине.
Config:
<configuration>
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="false" maxSizeOfMessageToLog="2147483647" />
</diagnostics>
<services>
<service behaviorConfiguration="MyServiceBehaviors" name="MyService">
<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding"
name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com"
contract="IMyService">
</endpoint>
</service>
</services>
<bindings>
<basicHttpBinding>
<binding name="basicHttpBinding" maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="2147483647" />
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows" proxyCredentialType="None" />
</security>
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="WindowsClientOverTcp" maxReceivedMessageSize="2147483647">
<readerQuotas maxStringContentLength="2147483647" />
</binding>
</netTcpBinding>
<wsHttpBinding>
<binding name="wsHttpBinding" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="32" maxStringContentLength="2147483647"
maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="MyServiceBehaviors">
<serviceMetadata httpGetEnabled="true" />
<serviceAuthorization principalPermissionMode="UseWindowsGroups"
impersonateCallerForAllOperations="false" />
<serviceCredentials />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
[ServiceContract]
отсутствовал в моем случае.
@Garry (немного поздно, я знаю)
Если ваш атрибут ServiceContract определяет имя ConfigurationName, это должно быть значение в конечной точке, а не полное имя. У меня была эта проблема сейчас, как описано OP, и это было для меня решением. Надеюсь, это поможет кому-то другому, кто наткнулся на это.
Это немного более необычное решение, применимое к моей ситуации с той же ошибкой:
Возможно, что пространство имен контрактов может быть переопределено со следующим атрибутом:
[System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")]
public interface ISomeOtherServiceName
Что потребует:
<endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" />
Вместо обычного (пространства имен).ISomeOtherServiceName.
Это может быть результатом генерации кода, в моем случае WSCFBlue
Не атрибут контракта на конечной точке должен быть полностью квалифицированным пространством имен?
Атрибут имени в элементе службы и атрибут контракта в элементе конечной точки неверны. Они должны быть полностью квалифицированными именами:
<service name="namespace.MyService">
<endpoint contract="namespace.IMyService" >
Как только вы измените значения, чтобы быть полностью квалифицированными именами, которые должны устранить вашу ошибку.
да @Гарри, ты прав. контракт в конечной точке должен быть полностью квалифицированным именем
<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com" contract="Namespace.IMyService">
У меня есть привычка делать это...
<system.serviceModel>
<services>
<service name="Service" behaviorConfiguration="wsHttpBehaviour">
<endpoint
binding="wsHttpBinding"
contract="IService"
bindingConfiguration="wsHttpBinding"
/>
<endpoint contract="IService" binding="mexHttpBinding" address="mex" />
</service>
когда я должен это сделать...
<system.serviceModel>
<services>
<service name="namespace.Service" behaviorConfiguration="wsHttpBehaviour">
<endpoint
binding="wsHttpBinding"
contract="namespace.IService"
bindingConfiguration="wsHttpBinding"
/>
<endpoint contract="namespace.IService" binding="mexHttpBinding" address="mex" />
</service>
Посмотрите, что я имею в виду... Это самая тупая вещь (особенно, когда приложение содержит только 1 или 2 элемента), но "полнофункциональное" имя класса, похоже, имеет значение.
можете ли вы отправить код своего интерфейса...? как обычно это происходит, если вы не указали атрибут ServiceContract в своем интерфейсе...
У меня была такая же ошибка, но источник проблемы был другим. Я учился, когда собираюсь, и сначала создал службу с использованием службы WCF с поддержкой Silverlight из шаблонов Silverlight в Visual Studio. Я позвонил в эту Территорию. Когда вы создаете службу таким образом, web.config изменяется следующим образом:
<services>
<service name="Services.TerritoryService">
<endpoint address="" binding="customBinding" bindingConfiguration="Services.TerritoryService.customBinding0"
contract="Services.TerritoryService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
</service>
</services>
В примерах, которые Im работает, однако, используйте DomainServices.i.e. при их использовании вы получаете наследство от DomainService. Поэтому я удалил созданную TerritoryService, а затем создал класс DomainService из шаблона из меню веб-шаблонов в Visual Studio. Я продолжал работать, и все составило просто отлично. Но когда я его запустил, я получил ошибку в соответствии с названием этого вопроса.
Проблема заключается в том, что при наследовании от службы домена такая запись не создается в файле web.config. Это не нужно. Но когда вы удаляете службу, созданную с помощью веб-службы с поддержкой Silverlight, она НЕ удаляет запись в файле web.config.
Итак, поскольку я назвал обе службы TerritoryService, когда служба вызывалась, запись в файле web.config была втянута в игру, и сервер пошел искать службу, определенную таким образом, которую он не смог найти, потому что я удалил он.
Таким образом, решение заключалось в том, чтобы просто удалить заглушки для записей, как указано выше, которые были автоматически созданы Visual Studio в файле конфигурации, но не были автоматически удалены Visual Studio при удалении службы. Как только я это сделал, проблема была решена.
Мне потребовалось полчаса, чтобы справиться с этим, хотя из-за именования "конфликта". Это "выглядело" очень правильно и соответствовало многим примерам. Поэтому, если вы наследуете класс домена службы, вам не нужно/не должно иметь запись в файле конфигурации, как и при создании службы wcf.
В моем случае проблема была неправильным именем пространства имен. НТН
Используя визуальную студию 2013 "Добавить" → "Сервис", пункт меню создал разделы веб-конфигурации для меня, но с "концом конечной точки", установленным для имени конкретного класса, а не интерфейса.
Как только я исправил, что все начали работать.
Есть ли у вас проверка подлинности на вашей виртуальной машине в IIS? Попробуйте настроить его на анонимность и посмотреть, не работает ли он.
Хорошо, это действительно не удовлетворяет моему вопросу, но одним из способов, которым я решил его решить, было установить .NET 3.5. потому что обе мои другие среды имели 3.0.
Поэтому я действительно не определил, почему он будет работать в одной среде, а не в другой, особенно с этой ошибкой интерфейса.
Переместить цифру?
В моем случае есть 2 ошибки:
Конфигурационные разделы копируются из другого прокси-проекта, и я забыл изменить пространство имен на полный путь.
Как клиент, я скопировал раздел конечной точки в службы node - клиент также является службой wcf.