Asp.net web api 如何使用HttpClient.PostAsJsonAsync方法将多个参数传递给WebAPI操作?

Asp.net web api 如何使用HttpClient.PostAsJsonAsync方法将多个参数传递给WebAPI操作?,asp.net-web-api,dotnet-httpclient,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.Sour

我有一个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;
}
public static void Register(HttpConfiguration config)
{
  config.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{action}/{id}",
      defaults: new { id = RouteParameter.Optional }
  );
}
其中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工作得很好;它们中没有一个具有这样的多个参数

这是我的路线图:

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;
致:

这一切都是打字错误:)

编辑-2:

对于EDIT-1,请求转到以下WebAPI方法(这是错误的):

但是,当我将routeConfig编辑为以下内容时:

[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;
}
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}}

你的url是错误的。试着这样做:

var detailURI = "Favorites/GetFavoritesPaged?userId=34";
或者使用
{id}
路线:

var detailURI = "Favorites/GetFavoritesPaged/34";
但您必须修改参数名称:

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

您的url错误。试着这样做:

var detailURI = "Favorites/GetFavoritesPaged?userId=34";
或者使用
{id}
路线:

var detailURI = "Favorites/GetFavoritesPaged/34";
但您必须修改参数名称:

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

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


/ActionName?param=value

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


/ActionName?param=value

另一种方法是发布一个匿名类型,并让控制器接受一个动态类型

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;

    ...

}
var response=client.PostAsJsonAsync(新的{detailURI,pagininfo});
[HttpPost]
公共列表GetFavoritesPaged([FromBody]动态模型)
{
PaginInfo PaginInfo=(PaginInfo)model.PaginInfo;
long userid=(long)model.userid;
...
}

另一种方法是发布匿名类型,并让控制器接受动态类型

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;

    ...

}
var response=client.PostAsJsonAsync(新的{detailURI,pagininfo});
[HttpPost]
公共列表GetFavoritesPaged([FromBody]动态模型)
{
PaginInfo PaginInfo=(PaginInfo)model.PaginInfo;
long userid=(long)model.userid;
...
}

刚才更新了我的问题,正如你所指出的。以及它的工作原理。但是,你有没有更好的办法;而不是这样做(在url中添加参数)。在url中传递Id参数没有问题。另一种可能是使用视图模型,将所有内容都放在后车身有效载荷中,然后让您的操作采用一个表示视图模型的参数。实际上,它仍然不起作用。它转到另一个方法,该方法也有一个POST-verb属性和一个参数。[最初我说它有用是错的,因为我没有注意到它去了其他地方]。当我更改路由配置(请参见编辑)时,它会显示“未找到”。有关异常的更多详细信息,请参见编辑。您的edit-2的uri似乎有一个输入错误“api/Favorite/”…是否应该是“api/Favorites”?@Kiran,实际上,我已将我的控制器从“FavoritesController”重命名为“FavoriteController”,这就是您看到的原因。还有其他线索吗?刚刚更新了我的问题,正如你指出的。以及它的工作原理。但是,你有没有更好的办法;而不是这样做(在url中添加参数)。在url中传递Id参数没有问题。另一种可能是使用视图模型,将所有内容都放在后车身有效载荷中,然后让您的操作采用一个表示视图模型的参数。实际上,它仍然不起作用。它转到另一个方法,该方法也有一个POST-verb属性和一个参数。[最初我说它有用是错的,因为我没有注意到它去了其他地方]。当我更改路由配置(请参见编辑)时,它会显示“未找到”。有关异常的更多详细信息,请参见编辑。您的edit-2的uri似乎有一个输入错误“api/Favorite/”…是否应该是“api/Favorites”?@Kiran,实际上,我已将我的控制器从“FavoritesController”重命名为“FavoriteController”,这就是您看到的原因。还有其他线索吗?