Search code examples
c#servicestackfluentvalidation

No error messages with Fluent Validation in ServiceStack


I am just starting to familiarise myself with ServiceStack and have come upon FluentValidation. I have followed the introductions and created a small Hello App.

My problem is that when I try to validate the request DTO no error messages are returned to describe how it failed validation, only a blank Json object {}.

Myself, I think the validation is autowired to the DTO so there should be no need for me to write any extra code.

The answer is probably blatant but I cannot see it. Any help would be greatly appreciated. My code is below:

namespace SampleHello2
{
    [Route("/hello")]
    [Route("/hello/{Name}")]
    public class Hello
    {
        public string Name { get; set; }
    }

    public class HelloResponse
    {
        public string Result { get; set; }
    }


    public class HelloService : Service
    {
        public object Any(Hello request)
        {
            return new HelloResponse { Result = "Hello, " + request.Name };
        }
    }

    public class HelloValidator : AbstractValidator<Hello>
    {
        public HelloValidator()
        {
            //Validation rules for all requests
            RuleFor(r => r.Name).NotNull().NotEmpty().Equal("Ian").WithErrorCode("ShouldNotBeEmpty");
            RuleFor(r => r.Name.Length).GreaterThan(2);
        }
    }

    public class Global : System.Web.HttpApplication
    {
        public class HelloAppHost : AppHostBase
        {
            //Tell Service Stack the name of your application and where to find your web services
            public HelloAppHost() : base("Hello Web Services", typeof(HelloService).Assembly) { }

            public override void Configure(Funq.Container container)
            {
                //Enable the validation feature
                Plugins.Add(new ValidationFeature());
                container.RegisterValidators(typeof(HelloValidator).Assembly);
                //register any dependencies your services use, e.g:
                //  container.Register<ICacheClient>(new MemoryCacheClient());
            }
        }

        //Initialize your application singleton
        protected void Application_Start(object sender, EventArgs e)
        {
            new HelloAppHost().Init();
        }
    }
}

P.S. Really enjoying using ServiceStack, It really is a fantastic project so thanks.

Edit

So for example:

Calling: http://localhost:60063/hello/Ian?format=json returns {"Result":"Hello, Ian"}. Whereas Calling: http://localhost:60063/hello/I?format=json returns {}.

The second call returns {} where I was expecting auto generated error messages.


Solution

  • I found the answer. It was an overlook on my behalf:

    This was in the documentation and I overlooked it:

    All Error handling and validation options described below are treated in the same way - serialized into the ResponseStatus property of your Response DTO making it possible for your clients applications to generically treat all Web Service Errors in the same way.

    So all that was missing from my code was to add the following line into the HelloResponse class.

    public ResponseStatus ResponseStatus { get; set; }