c# - WebApi2 OData返回自定义错误对象

标签 c# error-handling asp.net-web-api2 odata

我已经进行了密集搜索,但无法正常工作。

我已经拥有一个Web AP2 OData API,需要返回一个自定义错误类。

这是我所拥有的:

public class Error
{
    public string Code { get; set; }
    public string Message { get; set; }
}

在Global.asax.cs中
protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);            

        GlobalConfiguration.Configuration.MessageHandlers.Add(new MessageInterceptor());
    }


 public class MessageInterceptor : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {

        return base.SendAsync(request, cancellationToken).ContinueWith(
                    task =>
                    {
                        var body = task.Result.Content.ReadAsStringAsync().Result;
                        var resultObj = JsonConvert.DeserializeObject(body.Replace("value", "Results"));                            
                        task.Result.Content = new ObjectContent(typeof(object), resultObj, new JsonMediaTypeFormatter());
                        return task.Result;
                    }, cancellationToken);
    }
}

在WebApiConfig中,cs
 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {

 config.Filters.Add(new  HandleApiExceptionAttribute());

}

}

public class HandleApiExceptionAttribute : ExceptionFilterAttribute, IExceptionFilter
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is Error)
        {
            var res = context.Exception.Message;

            //Define the Response Message
            HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(res),
                ReasonPhrase = res
            };

            //Create the Error Response
            context.Response = response;
        }
    }


 public class OrdersController : ODataControllerA controller
{
    private Context db = new Context();

    // GET: odata/Orders
    [Queryable]
    public IQueryable<Orders> GetOrders(ODataQueryOptions<Orders> opts)

{

<some code producing error>

Error theError = new Error()
        {
            Code = "1000",
            Message = "Geen filter gespecificeerd"
        };

        HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, theError);
        //return Request.CreateResponse(HttpStatusCode.BadRequest, theError);
        throw new HttpResponseException(response);

}

当我尝试此操作时,MessageInterceptor崩溃。

这是因为使用该API的第三方希望使用特定格式。

代码正确运行后,将返回结果{}

发生错误时,它应返回错误{code :,消息:}

有任何想法吗?

耶罗恩

最佳答案

这是我想出的:

我将 Controller 更改为:

 [Queryable, BasicAuthentication]
    public IHttpActionResult GetOrders(ODataQueryOptions<Orders> opts)
    {
        else
        {     

            Error theError = new Error()
            {
                Code = "1000",
                Message = "Geen filter gespecificeerd"
            };

            return new ErrorResult(theError, Request);

        }

        return Ok(resultList);
    }

使用此类:
public class ErrorResult : IHttpActionResult
{
    Error _error;
    HttpRequestMessage _request;

    public ErrorResult(Error error, HttpRequestMessage request)
    {
        _error = error;
        _request = request;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {            

        List<Error> _errorList = new List<Error>();
        _errorList.Add(_error);

        error err = new error()
        {
            errors = _errorList
        };

        var response = new HttpResponseMessage(HttpStatusCode.BadRequest)
        {
            Content = new ObjectContent<error>(err, new JsonMediaTypeFormatter()),
            RequestMessage = _request
        };
        return Task.FromResult(response);
    }
}

public class Error 
{
    public string Code { get; set; }
    public string Message { get; set; }
}

public class error
{
    public List<Error> errors { get; set; }
}

关于c# - WebApi2 OData返回自定义错误对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43412622/

相关文章:

c# - 如何模仿内置的 .NET 序列化习惯用法?

perl - 在 perl 中安全运行这个容易出错的系统调用的正确方法是什么?

python-3.x - 用较短且正确的版本改进我的长python代码的建议

c# - 如何从webapi属性路由参数中的web.config获取默认值

c# - 每个请求调用的 ASP.NET Web API Controller 构造函数

c# - XmlDocument CreateElement 在前缀元素下没有 xmlns

C# ADO.NET 插入具有默认值的新行

c# - 为什么 Entity Framework 为 Azure 移动服务表 Controller 生成以下嵌套 SQL

c# - Console.SetOut 到 StreamWriter,不断写入文本文件

go - Go 如何确定可以使用多个值的上下文?