如何处理我在 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 响应代码、任何响应对象或消息。