将模型传递给MVC获取WebApi的更好方法

时间:2016-05-27 15:55:59

标签: asp.net-mvc asp.net-web-api

我有来自uri的Get WebApi的复杂对象,

在WebApi,

Public IHttpActionresult GetData([FromUri]ComplexModel model)
{
    //some code
}

public class ComplexModel
{
    public int Id {get; set;}
    public string name {get; set;}
}

在MVC,

Public void CallWebApi()
{
   using(HttpClient client = new HttpClient())
   {
      var uri = baseApi + "Contoller/GetData?Id=1&name=testname";
      var response = client.GetAsync(uri).Result;
   }
}  

不是通过查询字符串传递复杂对象,而是有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

如果您需要使用HTTP GET方法,那么您没有其他选择(除了将这些参数传递到某个HTTP标头之外,我认为这不是一个好的选择)。

为了简化端点URI的创建,您可以创建一个静态方法,将对象序列化为查询字符串。

这样的事情应该有效(taken from this answer):

public string GetQueryString(object obj) {
    var properties = from p in obj.GetType().GetProperties()
                       where p.GetValue(obj, null) != null
                       select p.Name + "=" + HttpUtility.UrlEncode(p.GetValue(obj, null).ToString());

    return String.Join("&", properties.ToArray());
}

以这种方式使用它:

ComplexModel myModel = GetMyModel();
using(HttpClient client = new HttpClient())
{
   var uri = baseApi + "Contoller/GetData?" + GetQueryString(myModel);
   var response = await client.GetAsync(uri);
}

顺便说一句:请记住永远不要调用异步方法,然后以同步方式等待结果,this could lead to deadlocks