ValueProvider 永远不会被调用

Luc*_*iva 2 asp.net asp.net-mvc-4 asp.net-web-api

我正在使用MVC 4 Web API并且我有这个虚拟的 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这个 ValueProvider 应该true为任何询问的键返回,所以它总是在需要时为模型绑定器提供一个值。ValueProvider 在 WebApiConfig 中注册,如下所示:

WebApiConfig.cs

config.Services.Add(typeof(ValueProviderFactory), new DummyValueProviderFactory());
Run Code Online (Sandbox Code Playgroud)

代码编译并运行良好。我在 Account API 控制器中也有这个操作:

账户控制器.cs

public HttpResponseMessage Register(string foo) { ... }
Run Code Online (Sandbox Code Playgroud)

当我像下面这样调用它时,这个动作被调用得很好:

/register?foo=bar
Run Code Online (Sandbox Code Playgroud)

foo充满了bar预期;但如果我打电话:

/register
Run Code Online (Sandbox Code Playgroud)

服务器返回 404 消息No HTTP resource was found that matches the request URI 'http://localhost:14459/register'

此外,我在方法 ContainsPrefix() 和 GetValue() 中放置了断点,但它们从未被触发。

我究竟做错了什么?DummyValueProvider 不应该为testing参数提供值foo吗?

Cyb*_*axs 5

尝试这个

public HttpResponseMessage Get([ValueProvider(typeof(DummyValueProviderFactory))] string foo) {... }
Run Code Online (Sandbox Code Playgroud)

我强烈建议您阅读这篇最近的文章来自定义 Web Api 绑定。

更新:
阅读文章后,OP 能够找到解决方案。使用参数属性[ModelBinder]是它工作所必需的。这是因为除非参数被注释,否则[FromUri]是假设的。一旦使用[ModelBinder]注册的处理程序进行注释就被执行。

  • 再读一遍那篇文章,我现在明白,如果你没有为简单类型指定绑定方法,它默认为“[FromUri]”,并且永远不会调用值提供者。所以这就是我一直在寻找的答案!我需要指定我想要 ``[ModelBinder]`` 以便我的值提供者可以被调用。 (4认同)