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

Название контракта WCF "IMyService" не найдено?

Название контракта "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>
4b9b3361

Ответ 1

[ServiceContract] отсутствовал в моем случае.

Ответ 2

@Garry (немного поздно, я знаю)

Если ваш атрибут ServiceContract определяет имя ConfigurationName, это должно быть значение в конечной точке, а не полное имя. У меня была эта проблема сейчас, как описано OP, и это было для меня решением. Надеюсь, это поможет кому-то другому, кто наткнулся на это.

Ответ 3

Это немного более необычное решение, применимое к моей ситуации с той же ошибкой:

Возможно, что пространство имен контрактов может быть переопределено со следующим атрибутом:

[System.ServiceModel.ServiceContractAttribute([...], ConfigurationName = "IServiceSoap")]
public interface ISomeOtherServiceName

Что потребует:

<endpoint address="" binding="basicHttpBinding" contract="IServiceSoap" />

Вместо обычного (пространства имен).ISomeOtherServiceName.

Это может быть результатом генерации кода, в моем случае WSCFBlue

Ответ 4

Не атрибут контракта на конечной точке должен быть полностью квалифицированным пространством имен?

Ответ 5

Атрибут имени в элементе службы и атрибут контракта в элементе конечной точки неверны. Они должны быть полностью квалифицированными именами:

<service name="namespace.MyService">
      <endpoint contract="namespace.IMyService" >

Как только вы измените значения, чтобы быть полностью квалифицированными именами, которые должны устранить вашу ошибку.

Ответ 6

да @Гарри, ты прав. контракт в конечной точке должен быть полностью квалифицированным именем

<endpoint binding="basicHttpBinding" bindingConfiguration="basicHttpBinding"      name="MyService" bindingName="basicHttpBinding" bindingNamespace="http://my.test.com"  contract="Namespace.IMyService">

Ответ 7

У меня есть привычка делать это...

<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 элемента), но "полнофункциональное" имя класса, похоже, имеет значение.

Ответ 8

можете ли вы отправить код своего интерфейса...? как обычно это происходит, если вы не указали атрибут ServiceContract в своем интерфейсе...

Ответ 9

У меня была такая же ошибка, но источник проблемы был другим. Я учился, когда собираюсь, и сначала создал службу с использованием службы 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.

Ответ 10

В моем случае проблема была неправильным именем пространства имен. НТН

Ответ 11

Используя визуальную студию 2013 "Добавить" → "Сервис", пункт меню создал разделы веб-конфигурации для меня, но с "концом конечной точки", установленным для имени конкретного класса, а не интерфейса.

Как только я исправил, что все начали работать.

Ответ 12

Есть ли у вас проверка подлинности на вашей виртуальной машине в IIS? Попробуйте настроить его на анонимность и посмотреть, не работает ли он.

Ответ 13

Хорошо, это действительно не удовлетворяет моему вопросу, но одним из способов, которым я решил его решить, было установить .NET 3.5. потому что обе мои другие среды имели 3.0.

Поэтому я действительно не определил, почему он будет работать в одной среде, а не в другой, особенно с этой ошибкой интерфейса.

Переместить цифру?

Ответ 14

В моем случае есть 2 ошибки:

  • Конфигурационные разделы копируются из другого прокси-проекта, и я забыл изменить пространство имен на полный путь.

  • Как клиент, я скопировал раздел конечной точки в службы node - клиент также является службой wcf.