Контракт не найден в реализованных контрактах на этом узле службы

Я получаю сообщение об ошибке, упомянутое в заголовке, и не уверен, что именно я могу делать неправильно. Я использую Mono 2.10.6 на openSUSE. Проблема возникает только тогда, когда я пытаюсь перейти к службе WCF (веб-страницы загружаются нормально).

Сервисный код:

namespace CyberLane
{
    [ServiceContract]
    public class DataServices// : IDataServices
    {
        [OperationContract]
        public TweetDTO[] GetLatestTweets()
        {
            return MasterRepository.GetTweets().Select(x => new TweetDTO(x)).ToArray();
        }
    }
}

мой Web.config имеет следующее:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="CyberLane.DataServicesAspNetAjaxBehavior">
                 <enableWebScript />
            </behavior>
        </endpointBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
    <services>
        <service name="CyberLane.DataServices">
            <endpoint address="" behaviorConfiguration="CyberLane.DataServicesAspNetAjaxBehavior" binding="webHttpBinding" contract="CyberLane.DataServices" />
        </service>
    </services>
</system.serviceModel>

Пожалуйста, спросите меня, если вам нужна дополнительная информация, и я буду более чем счастлив поделиться! Это сводит меня с ума уже пару недель.


person JustinN    schedule 07.04.2012    source источник


Ответы (1)


Во-первых, наилучшая практика и общепринятый подход — украшать IDataServices (интерфейс) атрибутами ServiceModel, а не реализующим его классом.

person abatishchev    schedule 07.04.2012
comment
Изначально у меня было так, но я получал эту ошибку. Контракт «CyberLane.IDaServices» не был найден в реализованных контрактах на этом узле службы, поэтому я попробовал его без интерфейса и получил ту же ошибку. - person JustinN; 07.04.2012
comment
@JustinN: я рекомендую откатиться, я имею в виду использование интерфейса. Это позволит избежать дополнительных вопросов. Также убедитесь, что вы вводите правильно, WCF везде чувствителен к регистру. - person abatishchev; 07.04.2012
comment
Я откатился, и я все еще получаю сообщение об ошибке. Нужно ли мне делать что-то еще, чтобы он мог распознавать интерфейс как контракт, отличный от атрибута? - person JustinN; 07.04.2012
comment
@JustinN: Является ли сборка WCF внешней по отношению к веб-приложению? Если да - вы ссылались на него? Чтобы убедиться, что он загружен в момент активации контракта. - person abatishchev; 07.04.2012
comment
это все внутри одного и того же проекта. - person JustinN; 07.04.2012
comment
@JustinN: Вы пытались создать пустой проект веб-приложения, добавить проект wcf и начать? Другой способ - создать его под Windows, убедиться, что он работает, а потом открыть под Suse (если у вас Windows). - person abatishchev; 07.04.2012
comment
Только что попробовал новую службу WCF, которая работает в Windows, и она выдает ту же ошибку в OpenSUSE. Теперь я думаю, что, возможно, в Mono есть ошибка, а не в моем коде/конфигурации. - person JustinN; 08.04.2012
comment
@JustinN: Звучит разумно. К сожалению( Но из любопытства - какая разметка у вашего .svc файла? - person abatishchev; 08.04.2012
comment
@JustinN: А какую версию Mono вы используете? И как установить/запустить службу WCF, как обычное веб-приложение с использованием XSP? - person abatishchev; 08.04.2012
comment
Я попытался использовать совершенно новую службу WCF из Visual Studio с кодом по умолчанию. Это дало ту же ошибку, и я спросил на каналах Mono IRC, которые подтвердили, что текущая версия Mono нарушает WCF в Mod_Mono. Так что, к сожалению, мой код не виноват, это ошибка в моно-фреймворке. Исправление для кода находится на GitHub, когда я компилирую и запускаю этот код, кажется, что он работает. Спасибо тебе за помощь :) - person JustinN; 09.04.2012
comment
Рад помочь! Мне это тоже было интересно. Вроде ничего не принимает, но все равно можно проголосовать где-нибудь еще :)) - person abatishchev; 09.04.2012