我有一個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