gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 08:25:25 25 4
gpt4 key购买 nike

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

我已经拥有一个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com