3

我正在使用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();
    }
}

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

WebApiConfig.cs

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

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

AccountController.cs

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

当我像下面这样调用它时,该动作会被调用:

/register?foo=bar

并且如预期的那样foo充满;bar但如果我打电话:

/register

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

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

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

4

1 回答 1

5

尝试这个

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

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

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

于 2013-07-22T14:27:55.020 回答