将Model传递给Web API会产生null值

时间:2015-09-29 20:25:23

标签: c# winforms asp.net-web-api dotnet-httpclient

当我尝试使用Windows Forms Client将值传递给我的Web API时:

SessionModel s = new SessionModel()
{
    SessionID = "123456"
};
using (var client = new HttpClient())
{
client.BaseAddress = new Uri("http://localhost:49584/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("bearer", txtToken.Text.Trim());

try
{
    HttpResponseMessage response = await client.PostAsJsonAsync("api/account/depositaccounts", s);
    response.EnsureSuccessStatusCode();    // Throw if not a success code.

    if (response.IsSuccessStatusCode)
    {
        MessageBox.Show("Results", "Success!", MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
}
catch (HttpRequestException ex)
{
    MessageBox.Show(ex.Message);
}
}

API控制器代码是这样的:

 [HttpPost]
 [Authorize]
 [Route("DepositAccounts", Name = "DepositAccounts")]
 public HttpResponseMessage GetDepositAccounts(Models.AuthenticationBindingModel model)
 {            
     var sessionId = model.SessionID;
 }

当模型进入时,SessionID属性为null。我确认在客户端不是null。

另一方面,当使用Fiddler创建Json请求时,它可以工作。我在客户端丢失了什么吗?

感谢。

**编辑:在客户端将属性'SessionId'更改为'SessionID'。同样的问题。

2 个答案:

答案 0 :(得分:0)

将API签名更改为GetDepositAccounts(dynamic model)或在客户端和服务器端使用相同的类。

答案 1 :(得分:0)

显然在客户端,我用这样的构造函数声明我的类:

class SessionModel
{
    public SessionModel()
    {

    }

    public String SessionId { get; set; }
}

它导致一些额外的数据被添加到json请求中的字段('k__BackingField')。虽然有很多关于如何从响应中删除它的文章,但我无法弄清楚如何从请求中删除它。结果是在客户端声明了类,而没有构造函数删除'k__BackingField'文本然后请求工作。

class SessionModel
{
    public String SessionID { get; set; }
}

不确定这背后的原因,只是它发生了。如果有人想评论'为什么'那会很棒!