Anu*_*aus 16 c# json deserialization asp.net-web-api
我正在使用WebAPI v2.2,我正在使用[FromBody]属性将WebAPI反序列化到对象上.反序列化的目标类在内部方法上有一个[OnDeserialized]属性,如下所示:
[OnDeserialized]
internal void OnDeserialisedMethod(StreamingContext context) {
// my method code
}
Run Code Online (Sandbox Code Playgroud)
我知道这个方法中的代码存在问题,我已经逐步完成并找到了它.对我来说问题是我完全没有例外.发生的事情是这个方法被跳出来,异常似乎被忽略了.我的控制器操作被调用,我的目标对象未正确填充,因为此序列化方法未正确执行.
我的问题是; 如何捕获WebAPI中反序列化期间发生的异常?
bet*_*wse 16
我已经编写了一个过滤器(如各种注释中所建议的),它检查ModelState并在发生序列化错误时抛出异常.但要注意,这可能不仅包含序列化异常 - 可以通过在Select语句中指定具体的异常类型来调整.
public class ValidModelsOnlyFilter : ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
if (actionContext.ModelState.IsValid)
{
base.OnActionExecuting(actionContext);
}
else
{
var exceptions = new List<Exception>();
foreach (var state in actionContext.ModelState)
{
if (state.Value.Errors.Count != 0)
{
exceptions.AddRange(state.Value.Errors.Select(error => error.Exception));
}
}
if (exceptions.Count > 0)
throw new AggregateException(exceptions);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我建议在全局范围内绑定此过滤器.我真的无法理解为什么忽略反序列化异常应该没问题.
小智 5
我遇到了完全相同的问题,并将您的问题加为书签,以希望有人提供解决方案。我以为使用ModelState意味着在JSON模型中重写了一些验证,但它确实有效,实际上,它很简单而且做得很好。我不必修改模型,只需修改控制器即可。
我来自一个控制器的代码,StdResponse是用于在需要时提供详细信息的响应的类(例如,在这种情况下):
[HttpPost]
public StdResponse Test([FromBody]StdRequest request)
{
if (ModelState.IsValid)
{
//Work on the data from the request...
}
else
{
//Retrieve the exceptions raised during deserialization
var errors = ModelState.SelectMany(v => v.Value.Errors.Select(e => e.Exception));
List<String> messages = new List<string>();
foreach (Exception e in errors)
{
messages.Add(e.GetType().ToString() + ": " + e.Message);
}
return new StdResponse(exchangeVersion, "null", ExecutionResponse.WithError("StdRequest invalid", messages));
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5247 次 |
| 最近记录: |