0

我有一个 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是正确的方法还是有更好的方法,请建议?

EDIT-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}}
4

3 回答 3

3

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

/ActionName?param=value

于 2013-10-07T16:27:55.697 回答
1

你的网址是错误的。试试这样:

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

或使用{id}路线:

var detailURI = "Favorites/GetFavoritesPaged/34";

但是你必须修改你的参数名称:

public List<FavoriteDTO> GetFavoritesPaged(long id, PagingInfo pagingInfo)
于 2013-03-11T11:39:10.743 回答
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;

    ...

}
于 2014-08-19T12:17:54.190 回答