如何处理我在 asp.net web api 中想要的结果
How to deal with the result that i wanted in asp.net web api
我正在尝试为应用程序开发人员编写 Web api,我希望 api 结果像下面的示例
异常时:
{
"StatusCode": "0",
"Message": "There's exception when calling web api"
}
正常:json 字符串中的结果是网络 api 操作中的 return 类型。
{
"StatusCode": "1",
"Message": "Action completed successful",
"Result": {}
}
如果操作是:
public DemoController : ApiController
{
public class DemoModel
{
public string X {get;set;}
public int Y {get;set;}
}
[HttpGet]
public DemoModel GetModel(int id)
{
return new DemoModel() { X = "Demo return string" , Y = 1234};
}
}
调用动作成功时Json字符串应该是下面的示例
{
"StatusCode": "1",
"Message": "Action completed successful",
"Result": {
"X": "Demo return string",
"Y": 1234
}
}
当异常时,应该是:
{
"StatusCode": "0",
"Message": "There's exception when calling web api"
}
因此,应用程序开发人员可以在网络 api 帮助页面中查看 return 类型的详细信息。
实现起来容易吗?怎么做(不讲细节,只讲逻辑,还是讲细节更好。)
谢谢大家!
您应该创建 DelegatingHandler 来包装来自服务器的所有响应:
public class WrappingResponseHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return BuildApiResponse(request, response);
}
private static HttpResponseMessage BuildApiResponse(HttpRequestMessage request, HttpResponseMessage response)
{
object result;
string message = null;
int status;
if (response.TryGetContentValue(out result) == false || response.IsSuccessStatusCode == false)
{
var error = result as HttpError;
if (error != null)
{
result = null;
}
message = "There's exception when calling web api";
status = 0;
}
else
{
message = "Action completed successful";
status = 1;
}
HttpResponseMessage newResponse = request.CreateResponse(response.StatusCode,
new ApiResponse() { Message = message, Result = result, StatusCode = status });
foreach (KeyValuePair<string, IEnumerable<string>> header in response.Headers)
{
newResponse.Headers.Add(header.Key, header.Value);
}
return newResponse;
}
public class ApiResponse
{
public int StatusCode { get; set; }
public string Message { get; set; }
public object Result { get; set; }
}
}
并在 WebApiConfig 中添加此处理程序:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new WrappingResponseHandler()); //here
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
无需更改和添加控制器。
使用 IHttpActionResult 将非常有帮助,尤其是如果您考虑应用程序开发人员。它非常适用于 Http 响应代码,如 200(Ok)、500(Internal Server Error)、404(Not Found) 等
这是一个简单的代码示例,您可以根据 returns
获取产品并返回适当的响应
public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
return NotFound(); // Returns a NotFoundResult
}
return Ok(product); // Returns an OkNegotiatedContentResult
}
关于此的更多信息Action Results on Web Api 2,您甚至可以编写自定义操作结果。
当应用程序客户端消费时,它会获得正确的 HTTP 响应代码、任何响应对象或消息。
我正在尝试为应用程序开发人员编写 Web api,我希望 api 结果像下面的示例
异常时:
{
"StatusCode": "0",
"Message": "There's exception when calling web api"
}
正常:json 字符串中的结果是网络 api 操作中的 return 类型。
{
"StatusCode": "1",
"Message": "Action completed successful",
"Result": {}
}
如果操作是:
public DemoController : ApiController
{
public class DemoModel
{
public string X {get;set;}
public int Y {get;set;}
}
[HttpGet]
public DemoModel GetModel(int id)
{
return new DemoModel() { X = "Demo return string" , Y = 1234};
}
}
调用动作成功时Json字符串应该是下面的示例
{
"StatusCode": "1",
"Message": "Action completed successful",
"Result": {
"X": "Demo return string",
"Y": 1234
}
}
当异常时,应该是:
{
"StatusCode": "0",
"Message": "There's exception when calling web api"
}
因此,应用程序开发人员可以在网络 api 帮助页面中查看 return 类型的详细信息。
实现起来容易吗?怎么做(不讲细节,只讲逻辑,还是讲细节更好。)
谢谢大家!
您应该创建 DelegatingHandler 来包装来自服务器的所有响应:
public class WrappingResponseHandler : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
return BuildApiResponse(request, response);
}
private static HttpResponseMessage BuildApiResponse(HttpRequestMessage request, HttpResponseMessage response)
{
object result;
string message = null;
int status;
if (response.TryGetContentValue(out result) == false || response.IsSuccessStatusCode == false)
{
var error = result as HttpError;
if (error != null)
{
result = null;
}
message = "There's exception when calling web api";
status = 0;
}
else
{
message = "Action completed successful";
status = 1;
}
HttpResponseMessage newResponse = request.CreateResponse(response.StatusCode,
new ApiResponse() { Message = message, Result = result, StatusCode = status });
foreach (KeyValuePair<string, IEnumerable<string>> header in response.Headers)
{
newResponse.Headers.Add(header.Key, header.Value);
}
return newResponse;
}
public class ApiResponse
{
public int StatusCode { get; set; }
public string Message { get; set; }
public object Result { get; set; }
}
}
并在 WebApiConfig 中添加此处理程序:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MessageHandlers.Add(new WrappingResponseHandler()); //here
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
无需更改和添加控制器。
使用 IHttpActionResult 将非常有帮助,尤其是如果您考虑应用程序开发人员。它非常适用于 Http 响应代码,如 200(Ok)、500(Internal Server Error)、404(Not Found) 等
这是一个简单的代码示例,您可以根据 returns
获取产品并返回适当的响应public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
return NotFound(); // Returns a NotFoundResult
}
return Ok(product); // Returns an OkNegotiatedContentResult
}
关于此的更多信息Action Results on Web Api 2,您甚至可以编写自定义操作结果。
当应用程序客户端消费时,它会获得正确的 HTTP 响应代码、任何响应对象或消息。