C# Web API将自定义异常对象转换为基本异常

C# Web API将自定义异常对象转换为基本异常,c#,.net,asp.net-mvc,asp.net-web-api,exception-handling,C#,.net,Asp.net Mvc,Asp.net Web Api,Exception Handling,在利用web API开发一个新的web应用程序时,我决定创建一组基本的“响应”类是一个很好的实践,这些类可以容纳事务的结果,以及任何警告、错误或将来任何其他必要的数据。样本如下: 公共类VoidResultsVM { 公共bool issucess{get;set;} 公共列表结果{get;set;} 公共列表错误{get;set;} 公共列表警报{get;set;} public VoidResultsVM() { 结果=新列表(); 错误=新列表(); 警报=新列表(); } } 与此响应

在利用web API开发一个新的web应用程序时,我决定创建一组基本的“响应”类是一个很好的实践,这些类可以容纳事务的结果,以及任何警告、错误或将来任何其他必要的数据。样本如下:

公共类VoidResultsVM
{
公共bool issucess{get;set;}
公共列表结果{get;set;}
公共列表错误{get;set;}
公共列表警报{get;set;}
public VoidResultsVM()
{
结果=新列表();
错误=新列表();
警报=新列表();
}
}
与此响应对象关联的是一个自定义异常对象(“错误”)列表,这些对象是从.NET中的异常类派生的。这些类的主要好处是,我们可以准确地识别错误发生的位置,并且可以向用户添加自定义消息来解释错误。示例如下:

公共类错误:异常
{
//公共异常{get;set;}
公共字符串源{get;set;}
公共字符串UserMessage{get;set;}
私有日期时间戳;
公共DateTime时间戳{get{return TimeStamp;}set{TimeStamp=DateTime.Now;}
公共字符串解析{get;set;}
公共错误(字符串msg、异常ex、字符串来源、字符串usermessage、DateTime@timestamp、字符串解析=“”)
:碱(味精,ex)
{
原点=原点;
UserMessage=UserMessage;
时间戳=@时间戳;
分辨率=分辨率;
}
}
这个对象在开发和调试应用程序后端方面已经非常有用,我希望尽可能多地保留它

我遇到的问题是,在尝试一些API操作时,如果其中一个“Error”对象返回,Web API(我相信)正在将该“Error”对象转换为其基类Exception。有关API的JSON输出,请参见下文:

{
“IsSuccess”:错误,
“结果”:[],
“错误”:[{
“ClassName”:“App.Models.Error”,
“消息”:“获取历史记录时出错”,
“数据”:{
},
“内部异常”:{
“ClassName”:“System.Exception”,
“消息”:“未找到符合条件的记录”,
“数据”:空,
“InnerException”:null,
“帮助URL”:空,
“StackTraceString”:“在App.Database.DatabaseCore.GetHistory(HistorySearchVM历史记录)”中,
“RemoteStackTraceString”:空,
“RemoteStackIndex”:0,
“ExceptionMethod:“8\nGetShipmentHistory\nApp.Database,版本=1.0.0,区域性=neutral,PublicKeyToken=null\nApp.Database.DatabaseCore\nApp.Models.ViewModels.VoidResultsVM GetHistory(App.Models.ViewModels.HistorySearchVM)”,
“HResult”:-2146233088,
“来源”:“应用程序数据库”,
“WatsonBuckets”:空
},
“帮助URL”:空,
“StackTraceString”:空,
“RemoteStackTraceString”:空,
“RemoteStackIndex”:0,
“ExceptionMethod”:空,
“HResult”:-2146233088,
“源”:空,
“WatsonBuckets”:空
}],
“警报”:[]
}
所以我的问题是:如何更改我的“Error”类,使WebAPI在发回客户机时不会将其转换回基类?这是一种甚至可以被推翻的东西吗

编辑

下面是API控制器和数据库中用于创建和返回此对象的代码。代码中没有将错误对象转换为异常对象或从异常对象转换为错误对象的逻辑:

API控制器

public VoidResultsVM搜索(SearchVM)
{
DatabaseCore db=新的DatabaseCore();
VoidResultsVM结果=新的VoidResultsVM();
尝试
{
if(ModelState.IsValid)
{
结果=db.GetRecordById(vm.Id);
}
其他的
{
抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
};
}
捕获(错误)
{
抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
}
捕获(例外)
{
抛出新的HttpResponseException(Request.CreateResponse(HttpStatusCode.BadRequest));
}
db=null;
返回结果;
}
数据库

公共记录GetRecordById(int-id)
{
记录i=null;
使用(var transactionScope=TransactionScopeBuilder.CreateReadCommitted())
{
AppContext tempContext=null;
尝试
{
使用(tempContext=newAppContext())
{
i=tempContext.Records.Where(x=>x.Id==Id.FirstOrDefault();
}
}
捕获(例外情况除外)
{
Common.Common.Log(“”,logName,Common.Common.LogLevels.ERROR,ex);
抛出新错误(例如Message、例如“DATABASE”、DateTime.Now);
}
最后
{
transactionScope.Complete();
}
}
返回i;
}

在研究了一些解决方案后,我决定按照Michael的建议返回一个专用的视图模型,该视图模型包含调试使用最多的额外信息,并且只记录完整的错误模型。

调试时,是否一直在代码中键入
错误?您能提供实际返回/序列化响应的代码吗?据我所知,信息只会返回,因为您启用了异常详细信息。可能它不会转换异常的标准属性。查看并找到有关异常过滤器的部分。您的异常很好,但我会将其转换为错误消息模型。暴露sta是典型的不良做法