如何使用HttpClient.PostAsJsonAsync方法将多个参数传递给WebAPI Action?

时间:2013-03-11 11:28:50

标签: asp.net-web-api dotnet-httpclient

我有一个Web API操作如下:

[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是正确的方法还是有更好的方法,请提出建议?

修改-1: 改变了这个:

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

为:

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

这一切都是一个错字:)

修改-2:

使用EDIT-1,请求转到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}}

3 个答案:

答案 0 :(得分:3)

您可以尝试在控制器方法上添加ActionName属性。然后将ActionName附加到查询字符串。

/ ActionName?PARAM =值

答案 1 :(得分:1)

你的网址错了。试试这样:

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

或使用{id}路线:

var detailURI = "Favorites/GetFavoritesPaged/34";

但您必须修改参数名称:

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

答案 2 :(得分:0)

另一种方法是发布匿名类型,让Controller接受动态。

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;

    ...

}