目前我正面临一个问题,当尝试从MVC Api Client调用Web Api put方法时,让我们来描述我的代码结构
测试模型(Web Api结束)
public sealed class Test
{
[Required]
public int Id { get; set; }
[Required]
public string Name { get; set; }
}
Web Api PUT方法
public HttpResponseMessage Put(string token, IEnumerable<Test> data)
{
[...]
return Request.CreateResponse(HttpStatusCode.OK);
}
网络Api自定义过滤器
public sealed class ValidateFilterAttribute : ActionFilterAttribute
{
/// <summary>
///
/// </summary>
/// <param name="actionContext"></param>
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (!actionContext.ModelState.IsValid)
{
actionContext.Response = actionContext.Request.CreateErrorResponse(
HttpStatusCode.BadRequest, actionContext.ModelState);
}
}
}
从网络Api客户端调用
async System.Threading.Tasks.Task VerifiedFAccount()
{
using (var client = GetHttpClient())
{
var url = string.Concat("/api/Verfication", "?token=", token);
var data = new SampleTest { Id = 1, Name = "xxx" };
var temp = new List<SampleTest>();
temp.Add(data);
using (HttpResponseMessage response = await client.PutAsJsonAsync
<IEnumerable<SampleTest>>(url, temp).ConfigureAwait(false))
{
if (response.IsSuccessStatusCode)
{
}
}
}
客户端代码无法执行Api调用(即使我将调试点放在Web Api Put方法中,无法点击调试点)&amp;总是得到波纹管错误响应
{StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
Pragma: no-cache
X-SourceFiles: =?UTF-8?B?STpcRGV2QXJlYUxvY2FsXENPTVBBTlkgLSBQU1AgUFJPSkVDVFNcRS1BdXRob3JpdHkgLSBBdXN0cmVsaXlhXFNvdXJjZUNvbnRyb2xcVHJ1bmtcMDYgRGVjIDIwMTNcRS1BdXRob3JpdHkuQXBpIC0gMjAxM1xFYXV0aG9yaXR5LldlYi5BcGkuUHJlc2VudGF0aW9uTGF5ZXJcYXBpXFNtc2ZBY2NvdW50VmVyZmljYXRpb24=?=
Cache-Control: no-cache
Date: Mon, 14 Apr 2014 11:23:27 GMT
Server: Microsoft-IIS/8.0
Content-Length: 2179
Content-Type: application/json; charset=utf-8
Expires: -1
}}
但是当我从测试模型(Web Api结束)中删除[Required]
时。然后上面描述的客户端代码执行成功。
请告诉我这种混淆行为的原因是什么?
答案 0 :(得分:2)
您面临的问题可能是由于数据验证时默认配置的行为。您有Required
归因于非可空类型,并且int
不能为空,如果传入请求不是,则它将始终具有值(默认值为0
)提供价值。
在这些情况下,模型验证程序将抛出异常,因为在属性上具有不能为null的Required
属性是没有意义的。
您可以直接更改MVC应用程序的设置:
DataAnnotationsModelValidatorProvider
.AddImplicitRequiredAttributeForValueTypes = false;
这将消除框架引发的错误。这引入了一个问题,即使请求不包含属性,您将获得0
的值。让整数为Nullable<int>
更有意义。 Required
属性将能够处理null
值,您将知道传入请求是否包含属性
public sealed class Test
{
[Required]
public int? Id { get; set; }
[Required]
public string Name { get; set; }
}