C# ASP.NET Odata Web API的错误处理

C# ASP.NET Odata Web API的错误处理,c#,asp.net-web-api,odata,C#,Asp.net Web Api,Odata,我想知道在ODataController中引发异常的最佳实践是什么 如果在方法中引发异常,则默认情况下会将其转换为500响应代码,并且内容中包含有关错误的详细信息。我想明确的响应代码,并发送400的情况下,无效的关键 例如:如果输入请求有一个无效的密钥,则您希望返回一个400的HttpResponseCode,并且内容应该具有类似于引发异常的错误详细信息 非常感谢您的投入使用HttpResponseException, e、 g.抛出新的HttpResponseException(HttpSta

我想知道在ODataController中引发异常的最佳实践是什么

如果在方法中引发异常,则默认情况下会将其转换为500响应代码,并且内容中包含有关错误的详细信息。我想明确的响应代码,并发送400的情况下,无效的关键

例如:如果输入请求有一个无效的密钥,则您希望返回一个400的HttpResponseCode,并且内容应该具有类似于引发异常的错误详细信息


非常感谢您的投入

使用
HttpResponseException

e、 g.
抛出新的HttpResponseException(HttpStatusCode.NotFound)
可以找到详细信息。

OData(至少从v3开始)用于表示错误:

{
    "error": {
        "code": "A custom error code",
        "message": {
            "lang": "en-us",
            "value": "A custom long message for the user." 
        },
        "innererror": {
            "trace": [...],
            "context": {...}
        }
    }
}
Microsoft.Net包含用于在服务器端形成OData错误的类

要形成包含错误详细信息的正确OData错误响应(),您可以:

1) 使用方法在控制器的操作中形成并返回HttpResponseMessage

2) 使用与创建HttpResponseMessage相同的方法抛出HttpResponseException

throw new HttpResponseException(
    Request.CreateErrorResponse(HttpStatusCode.NotFound,  new ODataError { ErrorCode="...", Message="...", MessageLanguage="..." }));
3) 抛出自定义类型的异常,并使用Web Api操作筛选器将其转换

public class CustomExceptionFilterAttribute : ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext context)
    {
        if (context.Exception is CustomException)
        {
            var e = (CustomException)context.Exception;

            var response = context.Request.CreateErrorResponse(e.StatusCode, new ODataError
            {
                ErrorCode = e.StatusCodeString,
                Message = e.Message,
                MessageLanguage = e.MessageLanguage
            });
            context.Response = response;
        }
        else
            base.OnException(context);
    }
}

检查。在Microsoft.AspNet.OData中使用的名称空间。我的代码就是用这个来工作的。

对于带有OData的ASP.NET Core,将
Get
方法上的
EnableQueryAttribute
替换为一个自定义属性,该属性捕获
ODataException
并抛出一个自定义异常。在大多数情况下,这允许标准错误处理按预期进行。最初在找到此解决方案

对于自定义属性,请使用类似以下内容:

public class CustomEnableQueryAttribute : EnableQueryAttribute
{
    public override void ValidateQuery(HttpRequest request, ODataQueryOptions queryOptions)
    {
        try
        {
            base.ValidateQuery(request, queryOptions);
        }
        catch (ODataException e)
        {
            throw new CustomException(e.Message, e){UserMessage = "Invalid OData query."};
        }
    }
}
[HttpGet, CustomEnableQuery]
public virtual IQueryable<TDomainDto> Get()
{
    return Repository.Get();    
}
在您的
Get
方法中,使用如下内容:

public class CustomEnableQueryAttribute : EnableQueryAttribute
{
    public override void ValidateQuery(HttpRequest request, ODataQueryOptions queryOptions)
    {
        try
        {
            base.ValidateQuery(request, queryOptions);
        }
        catch (ODataException e)
        {
            throw new CustomException(e.Message, e){UserMessage = "Invalid OData query."};
        }
    }
}
[HttpGet, CustomEnableQuery]
public virtual IQueryable<TDomainDto> Get()
{
    return Repository.Get();    
}
[HttpGet,CustomEnableQuery]
公共虚拟IQueryable Get()
{
返回Repository.Get();
}

Key not found应该会引发404问题
CreateODataErrorResponse
扩展方法有什么用,我们应该在什么时候使用它?