2013-03-11 2 views
0

У меня есть действие Web API следующим образом:Как передать несколько параметров в действие WebAPI с использованием метода HttpClient.PostAsJsonAsync?

[HttpPost] 
public List<FavoriteDTO> GetFavoritesPaged(long userId, PagingInfo pagingInfo) 
{ 
    var result = _userService.GetFavoritesPaged(fav => fav.UserId == userId, pagingInfo); 
    var favDTOs = ConvertToDTOs(result.Source); 
    return favDTOs; 
} 

Мне нужно вызвать его, используя HttpClient и я пытаюсь его следующим образом:

информация пейджинговой необходимо передать методу GET.

var pagingInfo = new PagingInfo() 
{ 
    PageIndex = 1, 
    PageSize = 10, 
    OrderBy = "URL", 
    OrderDirection = OrderDirection.Desc 
}; 

где OrderDirection является перечисление:

public enum OrderDirection 
    { 
    Asc, 
    Desc 
    } 

var detailURI = "Favorites/GetFavoritesPaged?userId="+34; 

HttpClient client = new HttpClient() 
client.BaseAddress="mywebApiAddress"; 
var response = client.PostAsJsonAsync(detailURI, pagingInfo).Result; 
response.EnsureSuccessCode(); 
var result = JsonConvert.DeserializeObject(response.Content.ReadAsStringAsync().Result, 
             tyepof(FavoritesDTO)); 

Но ее не работает. В нем говорится о внутренней ошибке сервера, чего я здесь не вижу; это проблема, связанная с перечислением или что-то еще? У меня есть другие WebAPI, которые работают нормально; ни один из них не имеет более одного параметра.

Вот мой routConfig:

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
    ); 
    } 

Является ли это правильный способ вызова WebAPI с несколькими параметрами или есть лучший способ, пожалуйста, предложите?

EDIT-1: изменил это:

var detailURI = "Favorites/GetFavoritesPaged?userId?"+34; 

к:

var detailURI = "Favorites/GetFavoritesPaged?userId="+34; 

Все это опечатка :)

EDIT-2:

С РЕД-1, запрос идет к follwing метод WebAPI (что неправильно):

[HttpPost] 
    public FavoriteDTO AddToFavorites(FavoriteDTO favoriteDTO) 
    { 
     ------code to add to db------ 
    } 

Но, когда я редактировал routeConfig к следующему:

public static void Register(HttpConfiguration config) 
{ 
    config.Routes.MapHttpRoute(
     name: "DefaultApi", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: new { id = RouteParameter.Optional } 
); 
} 

Тогда я начал получать следующее исключение :

ReasonPhrase: Not Found 
Request: {Method: POST, RequestUri: 'http://localhost:60208/api/Favorite/GetPagedFavorites?user=1', Version: 1.1, Content: System.Net.Http.ObjectContent`1[[System.Object, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], Headers:{ Content-Type: application/json; charset=utf-8 Content-Length: 44}} 

ответ

1

Ваш адрес неверен. Попробуйте так:

var detailURI = "Favorites/GetFavoritesPaged?userId=34"; 

или использовать {id} маршрут:

var detailURI = "Favorites/GetFavoritesPaged/34"; 

Но тебе придется изменить свое имя параметра:

public List<FavoriteDTO> GetFavoritesPaged(long id, PagingInfo pagingInfo) 
+0

только что обновил мой вопрос, как вы указали. И его работа. Но, есть ли лучший способ, о котором вы можете думать; вместо этого (добавление параметров в url). – Baig

+0

Нет ничего плохого в передаче параметра Id в URL. Другая возможность - использовать модель представления и поместить все в полезную нагрузку тела POST, а затем заставить ваше действие принять один параметр, который будет представлять вашу модель представления. –

+0

Actualy, он все еще не работает. Он переходит к другому методу, который также имеет атрибут verst POST и один параметр. [Первоначально я был не прав, когда я сказал, что он работает, так как я не заметил, что он собирается куда-то еще]. Когда я изменяю конфигурацию маршрута (см. Редактирование), он говорит «Не найдено». Подробнее см. В разделе «Редактирование». – Baig

3

Вы можете попробовать поставить атрибут ActionName по методу контроллера. Затем добавьте ActionName в строку запроса.

/ActionName? Пары = значение

0

Другой подход заключается в публикации анонимного типа, и есть контроллер принимает динамический.

var response = client.PostAsJsonAsync(new { detailURI, pagingInfo }).Result; 

[HttpPost] 
public List<FavoriteDTO> GetFavoritesPaged([FromBody]dynamic model) 
{ 
    PagingInfo pagingInfo = (PagingInfo)model.pagingInfo; 
    long userid = (long)model.userId; 

    ... 

} 
Смежные вопросы