我有一个DataContract,我的Web API操作方法接受它作为操作参数。ASP.Net Web API:格式化程序参数绑定异常
public HttpResponseMessage PostMyObject(MyObjectRequestDc objRequest){ ... }
[DataContract]
public class MyObjectRequestDc
{
public MyObjectRequestDc()
{
References = new List<Uri>();
}
[DataMember]
public List<Uri> References { get; set; }
}
合同的其中一个属性是URI对象('参考')的列表。
如果客户端提交包含未解析为正确URI的字符串的请求,则会在框架代码中深入抛出异常(因为它无法从给定字符串中实例化URI类):
实施例的Json输入:
{ “参考”:[ “这不是一个有效的URI”。 ]}
异常详细信息/堆栈跟踪
Error details: System.InvalidOperationException: This operation is not supported for a relative URI.
at System.Uri.get_AbsolutePath()
at GetAbsolutePathFromUri(Object)
at System.Web.Http.Metadata.Providers.AssociatedMetadataProvider`1.<>c__DisplayClass3.<GetMetadataForPropertiesImpl>b__0()
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateElements(IEnumerable model, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container)
at System.Web.Http.ModelBinding.FormatterParameterBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(Object model)
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass49.<ToAsyncVoidTask>b__48()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func`1 func, CancellationToken cancellationToken)
的要求是,该用户被返回的代码400(错误请求)的响应,并沿着“的引用URI‘XXX’的行的消息无效“。
目前,除了由GlobalExceptionFilter抓住并返回无益500。
理想情况下,我想这种情况下被捕获的模型状态错误或其他一些机制,这将让我来控制的响应。
选项,我认为: 1.创建一个自定义HttpParameterBinding类和处理异常呢? 2.更改参考属性为字符串对象的列表,然后处理该URI类的实例化控制器 3捕捉在GlobalExceptionFilter异常的动作方法中显式地和定制从这里的响应(这有一个排名代码的气味虽然...)
建议最受欢迎!
不会清除ModelValidatorProvider禁用所有模型验证?如果是这样,这不是一个可接受的解决方法,因为应用程序在很多其他地方依赖于模型验证。 – JTech
你是什么意思,“你可能会得到一个更好的行为与一个无效的模型状态”? – JTech
您预计何时发布错误修复程序将被发送? – JTech