问题集中在为请求提供标头,所以我假设只考虑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属性时提出疑问。我的回答是我不知道是谁添加了它,对我来说它没有意义,但如果确实如此,请告诉我。
谢谢
答案 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;
我希望有人会发现它很有用。