2

Closed

BodyModelValidator fails on relative URIs

description

The value validator should instead either record a model error for that property or ignore it, but not bubble it up.

Stack Trace:

Exception:
ExceptionType: System.InvalidOperationException
Message: This operation is not supported for a relative URI.
StackTrace:
at System.Uri.get_AbsolutePath()
at System.ComponentModel.ReflectPropertyDescriptor.GetValue(Object component)
at System.Web.Http.Metadata.Providers.AssociatedMetadataProvider.<>c__DisplayClass9.<GetPropertyValueAccessor>b__8()
at System.Web.Http.Metadata.ModelMetadata.get_Model()
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateElements(IEnumerable model, ValidationContext validationContext, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateProperties(ModelMetadata metadata, ValidationContext validationContext, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.ValidateNodeAndChildren(ModelMetadata metadata, ValidationContext validationContext, Object container, String prefix)
at System.Web.Http.Validation.DefaultBodyModelValidator.Validate(Object model, Type type, ModelMetadataProvider metadataProvider, HttpActionContext actionContext, String keyPrefix)
at System.Web.Http.ModelBinding.FormatterParameterBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(Object model)
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass2b1.<>c__DisplayClass2d.<Then>b__2a()
at System.Threading.Tasks.TaskHelpersExtensions.<>c__DisplayClass3d.<ToAsyncVoidTask>b__3c()
at System.Threading.Tasks.TaskHelpers.RunSynchronously[TResult](Func
1 func, CancellationToken cancellationToken)
Closed Jun 6 at 12:24 AM by youssefm

comments

youssefm wrote Jun 29, 2012 at 9:26 PM

Repro:

Define action

public void Post([FromBody]Uri uri)

send a relative uri in the body

HongmeiG wrote Jun 29, 2012 at 11:06 PM

A more generalized repro is any model that have a public Getter that throws exception would cause an issue.

heneryville wrote Jan 21 at 7:29 PM

Also not that this still occurs for fields that are marked JsonIgnore and are not part of the serialization

HongmeiG wrote Mar 12 at 9:40 PM

I don't think we should validate every property on Uri instance.

For the more generalized repro, if a getter fails, should we simply not invoking a property if there is no attributes on that property to validate against.