使用 System.Web.Http 从控制器返回错误代码
Returning Error Code from Controller with System.Web.Http
我编写了一个非常轻量级的 REST API 来验证用户。我想 return 将验证作为 JSON object,我可以这样做,但是如果缺少参数,我想用一些信息来回击错误。这是我的控制器
public class GraphAccessController : ApiController
{
private UserValidation _userValidation;
private UserPermissions _userPermissions;
string _application;
public GraphAccessController()
{
_userValidation = new UserValidation();
_userPermissions = new UserPermissions();
}
public object GetUserValidation(string application)
{
if (string.IsNullOrEmpty(application))
{
return StatusCode(HttpStatusCode.MethodNotAllowed);
//return new HttpResponseException(HttpStatusCode.MethodNotAllowed);
}
try
{
_application = application;
ValidateUser(WindowsIdentity.GetCurrent(), application);
return _userValidation;
}
catch (HttpResponseException e)
{
string error = e.ToString();
return StatusCode(HttpStatusCode.InternalServerError);
}
}....(other private calls for validation)
{
当传入 "application" 时,我得到一个很好的 JSON object 返回。但是,当我在检查 IsNullOrEmpty 时试图 return 向用户发送错误时,如果我只是用 PostMan 调用:
return StatusCode(HttpStatusCode.MethodNotAllowed)
状态设置为“405 方法不允许”,但我想传递一些文本来说明失败的原因。所以我尝试了:
throw new HttpResponseException(HttpStatusCode.MethodNotAllowed);
这只是在我的控制下停止执行。所以我做了一个 return 而不是抛出 我得到 200 的状态(表示一切正常)但是 JSON header 数据:
{
"Response": {
"Version": {
"_Major": 1,
"_Minor": 1,
"_Build": -1,
"_Revision": -1
},
"Content": null,
"StatusCode": 405,
"ReasonPhrase": "Method Not Allowed",
"Headers": [],
"RequestMessage": null,
"IsSuccessStatusCode": false
},
"Message": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response'
property of this exception for details.",
"Data": {},
"InnerException": null,
"TargetSite": null,
"StackTrace": null,
"HelpLink": null,
"Source": null,
"HResult": -2146233088 }
正如您从 catch 中的代码中看到的那样,我也在尝试做相同类型的事情。您如何 return 将带有相应信息文本的 StatusCode 发送给调用者,以便他们可以检查状态,如果不是 200,请检查 body 中的错误文本?
谢谢
尝试使用所需的 HttpStatusCode 返回内容响应,如下所示:
catch (HttpResponseException e)
{
string error = e.ToString();
return Content(HttpStatusCode.MethodNotAllowed, error);
}
我编写了一个非常轻量级的 REST API 来验证用户。我想 return 将验证作为 JSON object,我可以这样做,但是如果缺少参数,我想用一些信息来回击错误。这是我的控制器
public class GraphAccessController : ApiController
{
private UserValidation _userValidation;
private UserPermissions _userPermissions;
string _application;
public GraphAccessController()
{
_userValidation = new UserValidation();
_userPermissions = new UserPermissions();
}
public object GetUserValidation(string application)
{
if (string.IsNullOrEmpty(application))
{
return StatusCode(HttpStatusCode.MethodNotAllowed);
//return new HttpResponseException(HttpStatusCode.MethodNotAllowed);
}
try
{
_application = application;
ValidateUser(WindowsIdentity.GetCurrent(), application);
return _userValidation;
}
catch (HttpResponseException e)
{
string error = e.ToString();
return StatusCode(HttpStatusCode.InternalServerError);
}
}....(other private calls for validation)
{
当传入 "application" 时,我得到一个很好的 JSON object 返回。但是,当我在检查 IsNullOrEmpty 时试图 return 向用户发送错误时,如果我只是用 PostMan 调用:
return StatusCode(HttpStatusCode.MethodNotAllowed)
状态设置为“405 方法不允许”,但我想传递一些文本来说明失败的原因。所以我尝试了:
throw new HttpResponseException(HttpStatusCode.MethodNotAllowed);
这只是在我的控制下停止执行。所以我做了一个 return 而不是抛出 我得到 200 的状态(表示一切正常)但是 JSON header 数据:
{ "Response": { "Version": { "_Major": 1, "_Minor": 1, "_Build": -1, "_Revision": -1 }, "Content": null, "StatusCode": 405, "ReasonPhrase": "Method Not Allowed", "Headers": [], "RequestMessage": null, "IsSuccessStatusCode": false }, "Message": "Processing of the HTTP request resulted in an exception. Please see the HTTP response returned by the 'Response' property of this exception for details.", "Data": {}, "InnerException": null, "TargetSite": null, "StackTrace": null, "HelpLink": null, "Source": null, "HResult": -2146233088 }
正如您从 catch 中的代码中看到的那样,我也在尝试做相同类型的事情。您如何 return 将带有相应信息文本的 StatusCode 发送给调用者,以便他们可以检查状态,如果不是 200,请检查 body 中的错误文本?
谢谢
尝试使用所需的 HttpStatusCode 返回内容响应,如下所示:
catch (HttpResponseException e)
{
string error = e.ToString();
return Content(HttpStatusCode.MethodNotAllowed, error);
}