2013-06-21 57 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