2014-04-14 44 views
2

目前我面臨的,出了問題,當嘗試從MVC API客戶端調用網絡API put方法,讓形容我的代碼結構波紋管如何使用[必需]屬性及模型狀態驗證的Web API中的工作將

測試模型(網頁API完)

public sealed class Test  
    { 
     [Required] 
     public int Id { get; set; } 
     [Required] 
     public string Name { get; set; } 
    } 

網絡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調用(連我放在網頁API Put方法中的調試點,無法點擊調試點)&總是得到了波紋管錯誤響應

{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 
}} 

但是當我從刪除[Required]測試模型(Web Api結束)。然後上述客戶端代碼成功執行。

請告訴我這種混淆行爲的原因是什麼?

+0

爲什麼你送'Test'數組的服務?在我的一些項目中,實施ITraceWriter並註冊它是非常有用的,以便找到類似錯誤的原因(請參閱http://www.asp.net/web-api/overview/testing-and-debugging/tracing -in-ASPNET的Web-API)。 – Markus

回答

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; } 
} 
+0

'.AddImplicitRequiredAttributeForValueTypes = false;'很好知道,但在我的情況下,實際問題不是'public int?'。我將我的項目從4轉換到4.5,問題不復存在。以前的項目與框架4,發生故障的一些方式。 (令人驚訝但確實如此) –

相關問題