Имя контракта WCF 'IMyService' не найдено?
Имя контракта 'IMyService' не может быть найдено в списке контрактов, реализованных службой 'MyService'.. ---> System.InvalidOperationException: имя контракта 'IMyService' не может быть найдено в списке контрактов, реализованных Сервис "МойСервис".
Это сводит меня с ума. У меня есть веб-служба WCF, которая работает на моей машине разработчика, но когда я копирую ее на виртуальную машину, которую я использую для тестирования, я получаю сообщение об ошибке, которое указывает на то, что я не реализую интерфейс, но не смысл, потому что служба работает на моем windows xp IIS. Виртуальная машина использует Windows Server 2003 IIS. Есть идеи?
Стоит отметить, что эта ошибка возникает на моей виртуальной машине, даже когда я пытаюсь получить доступ к службе в веб-браузере в качестве клиента.
Примечание: я использую PrincipalPermissionMode="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>
14 ответов
@ Гарри (немного поздно, я знаю)
Если ваш атрибут ServiceContract определяет ConfigurationName, это должно быть значение в конечной точке, а не полное имя. У меня просто была эта проблема, как описано в ОП, и это было для меня решением. Надеюсь, что это помогает кому-то еще, кто сталкивается с этим.
Это немного более необычное решение, которое применимо к моей ситуации с той же ошибкой:
Возможно, что пространство имен контракта может быть переопределено следующим атрибутом:
[System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")]
public interface ISomeOtherServiceName
Что потребует:
<endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" />
Вместо обычного (пространство имен).ISomeOtherServiceName.
Это может быть результатом генерации кода, в моем случае WSCFBlue
Ваш атрибут name в элементе service и атрибут контракта в элементе endpoint неверны. Они должны быть полностью квалифицированными именами:
<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 в вашем интерфейсе...
В моем случае проблема заключалась в неправильном названии пространства имен. НТН
Используя визуальную студию 2013 "Добавить"->"Сервис", я создал разделы веб-конфигурации для меня, но с "конечной точкой" "контракт" было установлено имя конкретного класса, а не интерфейса.
Как только я исправил, все заработало.
У меня была та же ошибка, но источник проблемы был другим. Я учился по ходу дела и сначала создал службу с использованием службы WCF с поддержкой Silverlight из шаблонов Silverlight в Visual Studio. Я назвал это TerritoryService. Когда вы создаете сервис таким способом, 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>
Однако примеры, над которыми я работаю, используют DomainServices.ie при их использовании, которые вы наследуете от DomainService. Поэтому я удалил созданный мною TerritoryService, а затем создал класс DomainService из шаблона из меню веб-шаблонов в Visual Studio. Я продолжал работать, и все было хорошо. Но когда я запустил его, я получил ошибку в соответствии с названием этого вопроса.
Проблема оказывается в том, что при наследовании от доменной службы такая запись не создается в файле web.config. Это не нужно. Но при удалении службы, созданной через веб-службу с поддержкой Silverlight, она НЕ удаляет запись в файле web.config.
Поэтому, поскольку я назвал обе службы TerritoryService, когда служба вызывалась, запись в файле web.config была запущена, и сервер начал искать службу, определенную таким образом, которую он не смог найти, потому что я удалил ее.
Поэтому решение состояло в том, чтобы просто удалить заглушки ввода, как описано выше, которые были автоматически созданы Visual Studio в файле конфигурации, но не были автоматически удалены Visual Studio, когда я удалил службу. Как только я это сделал, проблема была решена.
Мне потребовалось полчаса, чтобы разобраться с этим из-за именного "конфликта". Он "выглядел" очень правильно и соответствовал многим примерам. Поэтому, если вы наследуете от класса обслуживания домена, вам не нужно / не должно быть записи в файле конфигурации, как вы это делали при создании службы wcf.
Ладно, это не совсем удовлетворяет мой вопрос, но я нашел один способ его решения - установить.NET 3.5. потому что оба моих окружения имели 3.0.
Так что я действительно не определил, почему это будет работать в одной среде, а не в другой, особенно с такой ошибкой интерфейса.
Пойди разберись?
В моем случае 2 ошибки:
Разделы конфигурации скопированы из другого прокси-проекта, и я забыл изменить пространство имен на полный путь.
Как клиент, я скопировал раздел оконечной точки в узел сервисов - клиент также является сервисом wcf.
У вас есть какая-либо аутентификация на вашей виртуальной машине в IIS? Попробуйте установить его на анонимный и посмотреть, работает ли он.