用JArray发送自定义错误状态码

问题描述:

我有webapi,返回JArray。 有什么办法可以发送一些我选择的状态码(如422,4XX)?用JArray发送自定义错误状态码

 //GET api/UserControl/GetUserName 
    public JArray GetUserName() 
    { 
     JArray json = new JArray(); 
     try 
     { 
      string UserID= getUserID(); 
      if (!string.IsNullOrEmpty(UserID) || UserID== "None Was found") 
      { 
       var result = JsonConvert.SerializeObject(donorRep.GetUserFullName(UserID), Formatting.None, 
        new JsonSerializerSettings() 
        { 
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore 
        }); 
       try 
       { 
        json = JArray.Parse(result); 
       } 
       catch 
       { 
        json.Add(result.ToString()); 
       } 
      } 
      else 
      { 
       json.Add("There was an issue while retrieving your UserID."); 
      } 
     } 
     catch (JsonSerializationException ex) 
     { 
      json.Add("There was an issue while retrieving your IDSID. Please contact support"); 
     } 
     return json; 
    } 

例如,如果有一个错误在这里比在UI:

json.Add("There was an issue while retrieving your UserID"); 

包装你的数组JSON对象里面,然后状态代码和任何其他“元”的信息添加附加属性你可能需要。例如,你可以尝试让JSON响应是这个样子:

{ 
    "statusCode" : 422 
    "errorMessage" : "Error message, if any, goes here." 
    "results" : [ 
     "item 1", 
     "item 2", 
     "etc.", 
     "you can also use objects here instead of strings if your data is more complex" 
    ] 
} 

然后让你的代码是这样的:

// GET api/UserControl/GetUserName 
public JObject GetUserName() 
{ 
    JArray resultArray = new JArray(); 
    int statusCode = 200; // success 
    string errorMessage = null; 

    try 
    { 
     string UserID= getUserID(); 
     if (!string.IsNullOrEmpty(UserID)) 
     { 
      var fullName = donorRep.GetUserFullName(UserID); 
      resultArray.Add(fullName); 
     } 
     else 
     { 
      statusCode = 421; // error 
      errorMessage = "There was an issue while retrieving your UserID."; 
     } 
    } 
    catch (Exception ex) 
    { 
     statusCode = 422; // error 
     errorMessage = "There was an issue while retrieving your IDSID. Please contact support."; 
    } 

    JObject response = new JObject(); 
    response.Add("statusCode", statusCode); 
    response.Add("errorMessage", errorMessage); 
    response.Add("results", resultArray); 

    return response; 
} 

你必须调整你的客户端代码是能够提取响应的部分。如果你正在使用jQuery,例如,你可以得到的数据是这样的:

$.get("/api/UserControl/GetUserName") 
.done(function(data) { 
    var statusCode = data.statusCode; 
    if (statusCode == 200) { 
     var userName = data.results[0]; 
     alert("Success! User name is " + userName); 
    } 
    else { 
     alert("Failed with code " + statusCode + ". message: " + data.errorMessage);   
    } 
}); 

为了完整起见,我还要提到的是,在网络API,您不必手动建立使用JObjects的JSON ,JArrays等。作为一种替代方法,您可以使用强类型类并直接从您的方法中返回这些类,并且Web API会将它们序列化为JSON。当然,这些类的结构必须与你想返回的JSON相匹配。例如,如果你想这样做的方法,你会定义一个类是这样的:

class ResponseData 
{ 
    public int statusCode { get; set; } 
    public string errorCode { get; set; } 
    public List<string> results { get; set; } 
    public ResponseData() 
    { 
     results = new List<string>(); 
    } 
} 

然后,你可以这样做:

public ResponseData GetUserName() 
{ 
    ResponseData response = new ResponseData { statusCode = 200 }; 

    try 
    { 
     string userID = getUserID(); 
     if (!string.IsNullOrEmpty(UserID)) 
     { 
      var fullName = donorRep.GetUserFullName(UserID); 
      response.results.Add(fullName); 
     } 
     else 
     { 
      response.statusCode = 421; // error 
      response.errorMessage = "There was an issue while retrieving your UserID."; 
     } 
    } 
    catch (Exception ex) 
    { 
     response.statusCode = 422; // error 
     response.errorMessage = "There was an issue while retrieving your IDSID. Please contact support."; 
    } 

    return response; 
}