Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ValueProvider never being called

I'm working with MVC 4 Web API and I have this dummy ValueProvider:

DummyValueProvider.cs

class DummyValueProvider : IValueProvider
{
    public DummyValueProvider()
    {
    }

    public bool ContainsPrefix(string prefix)
    {
        return true;
    }

    public ValueProviderResult GetValue(string key)
    {
        return new ValueProviderResult("testing", "testing", System.Globalization.CultureInfo.InvariantCulture);
    }
}

class DummyValueProviderFactory : System.Web.Http.ValueProviders.ValueProviderFactory
{
    public override IValueProvider GetValueProvider(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        return new DummyValueProvider();
    }
}

This ValueProvider should return true for any key asked, so it will always supply a value to the model binder when it needs. The ValueProvider is registered in the WebApiConfig like this:

WebApiConfig.cs

config.Services.Add(typeof(ValueProviderFactory), new DummyValueProviderFactory());

The code compiles and runs fine. I also have this action in the Account API controller:

AccountController.cs

public HttpResponseMessage Register(string foo) { ... }

The action gets called fine when I call it like below:

/register?foo=bar

And foo is filled with bar as expected; but if I call:

/register

The server returns 404 with the message No HTTP resource was found that matches the request URI 'http://localhost:14459/register'.

Also, I put breakpoints inside methods ContainsPrefix() and GetValue(), but they never get triggered.

What am I doing wrong? Shouldn't DummyValueProvider be providing the value testing to parameter foo?

like image 257
Lucio Paiva Avatar asked May 16 '26 05:05

Lucio Paiva


1 Answers

Try this

public HttpResponseMessage Get([ValueProvider(typeof(DummyValueProviderFactory))] string foo) {... }

I higly suggest you to read this recent article to customize Web Api Binding.

Update:
After reading the article the OP was able to discover the solution. It was that using the parameter attribute [ModelBinder] was required for it to work. This was because unless the parameter is annotated, [FromUri] is assumed. Once annotated with [ModelBinder] the registered handlers are executed.

like image 98
Cybermaxs Avatar answered May 18 '26 11:05

Cybermaxs



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!