1

我有一个 MVC 4 Web api 应用程序,它接收 json 对象并使用标准模型绑定工具将它们绑定到我的 poco 对象,以便在我的控制器方法中轻松使用。

当我收到的 json 结构直接映射到我的 poco 时,这一切都很好。例如我有一个控制器方法

 public HttpResponseMessage Post(DeviceConfigurationDto deviceConfiguration)

和 DeviceConfigurationDto 是

public class DeviceConfigurationDto
    {
        public long Timestamp { get; set; }
        public string DeviceType { get; set; }
        public string AssetName { get; set; }
    }
}

我发布了以下 JSON

 {
        "Timestamp": 234234234,
        "DeviceType": "A555tom",
        "AssetName": "HV103"
    }

内置的模型绑定工具在处理变化方面做得很好,比如额外的字段或缺失的字段等等。但如果你把它推得太远。例如通过发布以下 json

    [
    {
        "Fields4": "asda",
        "Timestamp": 234234234,
        "DeviceType": "A555tom",
        "AssetName": "HV103"
    },
    {
        "Timestamp": 234234234,
        "DeviceType": "A555tom",
        "DedviceType": "A555tom",
        "AssetName": "HV103"
    }
]

它最终倒下了,我最终将我的方法中的参数设为空。

有没有办法让模型绑定在数据符合预期时工作,但也让我能够获取对模型绑定器来说有问题的数据,以便我可以记录我收到的请求不符合我的预期?

谢谢

4

1 回答 1

1

一种方法是使用自定义 ActionFilter。由于模型绑定发生在执行操作过滤器之前,因此您可以在自定义操作过滤器中获取操作参数。

例如:

public class LogFailToModelBindArgActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext context)
    {
        var deviceConfigurationArg = context.ActionArguments["deviceConfiguration"];
        if (deviceConfigurationArg == null) // fail to model bind data to argument ...
        {
            var jsonContent = context.Request.Content.ReadAsStringAsync().Result; // calling .Result here for sake of simplicity...
            Log(jsonContent);
        }
    }
}

行动:

    [LogFailToModelBindArgActionFilter]
    public HttpResponseMessage Post(DeviceConfigurationDto deviceConfiguration)
    {...}
于 2012-10-26T01:15:58.120 回答