tugberk tugberk - 1 year ago 110
C# Question

Suppress RequiredAttribute validation for the JsonMediaTypeFormatter in ASP.NET Web API

Assuming I sent the following request to my API:

POST http://localhost:4940/api/cars HTTP/1.1
User-Agent: Fiddler
Host: localhost:4940
Content-Type: application/json
Content-Length: 44


And I have the following Car class definition:

public class Car {

public int Id { get; set; }

public string Make { get; set; }

public string Model { get; set; }

public int Year { get; set; }

[Range(0, 500000)]
public float Price { get; set; }

The response I got back is as follows:

HTTP/1.1 400 Bad Request
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcRHJvcGJveFxCb29rc1xQcm9XZWJBUEkuU2FtcGxlc1xDaGFwdGVyMTNcRGF0YUFubm90YXRpb25WYWxpZGF0aW9uQXR0cmlidXRlc1NhbXBsZVxEYXRhQW5ub3RhdGlvblZhbGlkYXRpb25BdHRyaWJ1dGVzU2FtcGxlXGFwaVxjYXJz?=
X-Powered-By: ASP.NET
Date: Mon, 17 Sep 2012 11:38:58 GMT
Content-Length: 182

{"Message":"The request is invalid.","ModelState":{"car":["Required property 'Model' not found in JSON. Path '', line 1, position 44."],"car.Model":["The Model field is required."]}}

Here is the more readable form of the message body:

"Message": "The request is invalid.",
"ModelState": {
"car": [
"Required property 'Model' not found in JSON. Path '', line 1, position 44."
"The Model field is required."

As you can see, I also have one additional error message for car and I am guessing the
performs validation as well and it fails to perform the read action.

Is this the issue here? Is there any way I can suppress the validation at the JsonMediaTypeFormatter level? I don't want the formatter to perform validation because the validation is also performed by the
after the formatter reads the message body.


I debugged the source code and it tuns out the
throws an error if a Property is marked with Required and not supplied. the following code is a part from the

// Error must always be marked as handled
// Failure to do so can cause the exception to be rethrown at every recursive level and overflow the stack for x64 CLR processes
jsonSerializer.Error += (sender, e) =>
Exception exception = e.ErrorContext.Error;
formatterLogger.LogError(e.ErrorContext.Path, exception);
e.ErrorContext.Handled = true;

and this triggers the
method which puts the error inside the

public void LogError(string errorPath, Exception exception)
if (errorPath == null)
throw Error.ArgumentNull("errorPath");
if (exception == null)
throw Error.ArgumentNull("exception");

string key = ModelBindingHelper.ConcatenateKeys(_prefix, errorPath);
_modelState.AddModelError(key, exception);

I am still unable to suppress this behavior.

Answer Source

Sorry I misunderstood your question originally. OK here is what you need to do:

Create a class deriving from the original JsonMediaTypeFormatter and set a custom IRequiredMemberSelector

public class MyJsonMediaTypeFormatter : JsonMediaTypeFormatter
        public MyJsonMediaTypeFormatter() : base()
            RequiredMemberSelector = new MyRequiredMemberSelector();

In this custom IRequiredMemberSelector just define all properties to be not required.

public class MyRequiredMemberSelector : IRequiredMemberSelector
    public bool IsRequiredMember(System.Reflection.MemberInfo member)
        return false;

Now replace the default JsonMediaTypeFormatter with the customized one and there you go.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download