WCF WebAPI маршрутизация - PullRequest
       3

WCF WebAPI маршрутизация

0 голосов
/ 10 декабря 2011

Это, наверное, глупый вопрос ... но, черт возьми, я немного озадачен и расстроен.

Я пытаюсь добавить службу REST в свое приложение. Я хочу поддерживать два типа GET, которые имеют необязательные параметры.

В глобальном ascx у меня есть;

 routes.Add(new ServiceRoute("api/userstats", new HttpServiceHostFactory() { Configuration = config }, typeof(RESTService.APIs.UserStatsAPI))); 

А потом у меня в этом контроллере;

 [WebGet(UriTemplate = "{userguid}")]
    public IQueryable<UserStat> Get(string userguid)
    {
        return null;
    }

    [WebGet(UriTemplate = "{userguid}/{genericstatid}")]
    public IQueryable<UserStat> Get(string userguid, int genericstatid)
    {
        return null;
    }

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

Не может иметь две операции в одном контракте с одинаковым именем,

Я могу понять, почему, но я не уверен, как обойти это. Если бы это был MVC, я бы определил различные типы маршрутизации, но я не уверен, как это сделать в сервисном маршруте.

Спасибо за любую помощь. Я пойду принесу кофе и посмотрю, поможет ли это.

Ответы [ 2 ]

1 голос
/ 10 декабря 2011

Вы пытались оставить только последний метод с некоторыми изменениями?

[WebGet(UriTemplate = "{userguid}/{genericstatid}")]
public IQueryable<UserStat> Get(string userguid, int? genericstatid)
{
    if (genericstatid.HasValue)
    {
       // looking at one
    }
    else
    {
       // looking at all.
    }
    return null;
}

ОБНОВЛЕНИЕ:

Вот пример из моего кода, гдеесть операция с тем же именем, но с другими параметрами:

    /// <summary>
    /// Gets the javascript representation of important enumerations
    /// </summary>
    /// <returns></returns>
    [OperationContract, WebGet(UriTemplate = "get/javascriptEnums.js")]
    Stream GetEnumsJavascriptRegistration();

    /// <summary>
    /// Gets some file from server
    /// </summary>
    /// <param name="fileName">The name of the file to return</param>
    /// <returns></returns>
    [OperationContract, WebGet(UriTemplate = "get/{*fileName}")]
    Stream Get(string fileName);
0 голосов
/ 10 декабря 2011

Я решил эту проблему здесь, которая фактически была моей собственной непониманием, я предположил, что имя метода было неявно типом действия, т.е. веб-виджет должен был называться GET.Это не так, если у вас есть WebGet, вы можете вызывать имя метода как-нибудь еще и изменять параметры, как в примере Александра выше.И мой ниже;

  [WebGet(UriTemplate = "{userid}")]
        public IQueryable<UserStat> Get(int userid)
        {

[WebGet(UriTemplate = "{userid}/{genericstatid}")]
        public  IQueryable<UserStat> GetWithID(int userid, int? genericstatid)
        {
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...