Добавление методов REST в службы данных WCF?

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

Но, похоже, он работает неправильно.

Во-первых, я хочу спросить, законно ли это? или осуждается?

Причина, по которой мне нужно это сделать, заключается в том, что мне нужно добавить дополнительные методы REST, которые будут вызывать службы членства ASP.NET (таблицы находятся в базе данных) для проверки входа в систему, т.е.

    public bool IsValidLogin(string username, string password)
    {
        return System.Web.Security.Membership.ValidateUser(username, password);
    }

Вот что у меня есть (я упростил IsValidLogin для тестирования).

    [WebGet(UriTemplate = "TestMe")]
    public bool IsValidLogin()
    {
        return true;
    }

    // This method is called only once to initialize service-wide policies.
    public static void InitializeService(DataServiceConfiguration config)
    {
        // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc.
        // Examples:
        config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);
        config.SetServiceOperationAccessRule("IsValidLogin", ServiceOperationRights.All);

Теперь, когда я иду в

  http://localhost/MyDataAccess/MyService.svc/IsValidLogin

Кажется, я получаю истинное обратно в виде XML. Но я установил URI, поэтому я подумал, что смогу это сделать.

  http://localhost/MyDataAccess/MyService.svc/TestMe

Но это не удается? Я действительно запутался, есть идеи?

Также, чтобы это работало, мне нужно было добавить эту строку, но здесь немного, но запутано

    config.SetServiceOperationAccessRule("IsValidLogin", ServiceOperationRights.All);

Любая помощь действительно ценится


person mark smith    schedule 07.08.2010    source источник
comment
Какая привязка у вас есть в вашем web.config? Для поддержки SOAP и REST в WCF у меня было два класса с разными привязками.   -  person James Black    schedule 07.08.2010


Ответы (2)


Не комментируя приведенное выше обсуждение REST, просто публикую ссылку на документацию о том, как выполнять так называемые «сервисные операции»: http://msdn.microsoft.com/en-us/library/cc668788.aspx

person Vitek Karas MSFT    schedule 11.08.2010

Понятие ServiceOperation — это возможность, обеспечивающая именно тот выход, который вам нужен, когда вы хотите сделать что-то другое, кроме чтения данных из таблицы.

К сожалению, путь по умолчанию в WCF REST привел к неправильному пониманию того, как должны работать системы RESTful. REST — это не просто предоставление некоторых данных по URL-адресам.

У вас действительно есть два варианта: либо придерживаться стиля распределенных вычислений RPC, который предоставляет WCF на основе WS-*/SOAP, либо потратить некоторое время на изучение того, что на самом деле представляет собой REST. здесь есть несколько ссылок, которые помогут вам начать работу.

Я не могу сказать вам, что является правильным подходом для вашего сценария. Что я могу вам сказать, так это то, что вы не научитесь делать REST, используя текущую реализацию REST WCF. Я не говорю, что это невозможно сделать, просто вам придется много плыть вверх по течению.

person Darrel Miller    schedule 07.08.2010
comment
Даррел, я думаю, что REST уже отсортирован, у меня есть другой проект, над которым я работаю, и все в порядке... Моя база данных доступна через DataServices. Мне также нужно подключиться к ASP.NET Membership, который представляет собой таблицы (в моем случае) в БД... поэтому я подумал расширить (добавить) мой проект службы данных, включив в него некоторые методы отдыха.... - person mark smith; 08.08.2010
comment
Если у вас есть дополнительные комментарии, я слушаю, но я действительно не понимаю, как я упустил суть? можешь уточнить? WCF Rest работает с http-методами, такими как GET, PUT и т. д. Я поместил GET в качестве метода и возвращает некоторые данные.... - person mark smith; 08.08.2010
comment
@mark Если вы пытаетесь войти в систему, вы не выполняете запросы без сохранения состояния. Это ограничение REST. Если вы десериализуете объекты на клиенте и отправляете application/xml в качестве типа мультимедиа (что делает WCF), ваши запросы не являются самоописательными. Это еще одно ограничение REST. IsValidLogin нарушает ограничение идентификации ресурса. Я почти уверен, что вы не возвращаете гипермедиа и не используете клиент, управляемый гипермедиа, поэтому HATEOAS, вероятно, не входит в ваш список целей проектирования. Честно говоря, я не говорю, что вы делаете что-то неправильно, просто не думайте, что это ОТДЫХ. - person Darrel Miller; 08.08.2010
comment
Спасибо Даррел за комментарии, я не выполняю вход в систему. Вход в систему выполняется на клиенте. Я всего лишь запрос к веб-службе (в данном случае REST), и REST возвращает XML независимо от того, является ли это действительным входом в систему или нет.. Что касается десериализации объектов, то на самом деле я этого не делаю... остальные возвращают XML, и я использую класс .net для заполнения объекта .net из XML, возвращаемого остальными. Спасибо за ваши комментарии .. я постараюсь исследовать дальше - person mark smith; 08.08.2010