如何通过带标题的HttpClient将复杂对象发布到控制器的Post方法?

时间:2016-11-22 17:09:54

标签: c# asp.net-mvc

问题集中在为请求提供标头,所以我假设只考虑HttpClient.SendAsync()方法。不是PostAsync或PostAsJsonAsycn()

以下是我用来发送POST请求的代码:

var request = new HttpRequestMessage()
{
    RequestUri = new Uri(@"http://test/" + controllerUri),
    Method = HttpMethod.Post,
};

request.Headers.Add(_authHeader, c_authToken);
request.Content = new ObjectContent<RequestType>(content, new JsonMediaTypeFormatter());

var result = _client.SendAsync(request).Result;

我经常收到500错误,说明序列化对象上的持续时间属性无效,但事实上它是在对象中设置的。

我尝试使用mediatype设置为“application / json”的StringContent但是我得到了同样的错误。

控制器的post方法具有以下签名:

public HttpResponseMessage Post(MyContentObject内容) { ... }

在进入方法之前抛出异常。

有趣的是,当我从MyContentObject注释掉[Required]属性时:

public class MyContentObject
{
    [Required]
    public int Duration { get; set; }

    public decimal SomePropA { get; set; }
    public bool SomePropB { get; set; }
}

它可以正常工作,持续时间属性可以按预期正确设置。

所以也许问题是为什么在这种情况下添加[Required]属性会产生很多问题?您可能会对为什么将[Required]属性添加到int属性时提出疑问。我的回答是我不知道是谁添加了它,对我来说它没有意义,但如果确实如此,请告诉我。

谢谢

1 个答案:

答案 0 :(得分:1)

我对此做了更多研究。 所以我将从最后开始。此线程涵盖[必需]注释问题:http://aspnetwebstack.codeplex.com/workitem/270

基本上内置的InvalidModelValidatorProvider检查模型验证以获取如上所述的无意义注释(值类型属性始终为值)并抛出异常。上面的文章还提到了一种解决方法,可以避免在不更改现有注释的情况下抛出异常。

以下代码使您可以发布序列化为JSON且附加了标题的对象:

// var RequestType content <- this is an input parameter. 

var request = new HttpRequestMessage()
{
    RequestUri = new Uri(@"http://test/" + yourControllerUri),
    Method = HttpMethod.Post,
};

request.Headers.Add("YourHeaderName", "YourHeaderValue");
request.Content = new ObjectContent<RequestType>(content, new JsonMediaTypeFormatter());

var result = _client.SendAsync(request).Result;

我希望有人会发现它很有用。