2013-06-21 35 views
2

我有一个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异常的动作方法中显式地和定制从这里的响应(这有一个排名代码的气味虽然...)

建议最受欢迎!

回答

1

鉴于目前似乎还没有答案的问题,周围的工作,我要使用我的第二个选项:

变化的参考属性为String对象的列表,然后处理控制器的动作方法中的URI类的实例化

然后处理URI本身实例化期间发生的任何异常...

3

这是Web API中的一个错误。当任何类型的公共属性抛出时,它总是会失败。

它已经被固定在我们当前的位:https://aspnetwebstack.codeplex.com/workitem/611和修补程序应该在我们的下一个版本中提供。

如果禁用验证这样的解决方法:

config.Services.Clear(typeof(ModelValidatorProvider)); 

你可能会得到一个无效的模型状态更好的性能。

+0

不会清除ModelValidatorProvider禁用所有模型验证?如果是这样,这不是一个可接受的解决方法,因为应用程序在很多其他地方依赖于模型验证。 – JTech

+0

你是什么意思,“你可能会得到一个更好的行为与一个无效的模型状态”? – JTech

+0

您预计何时发布错误修复程序将被发送? – JTech