我正在使用 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
吗?
答案 0 :(得分:4)
试试这个
public HttpResponseMessage Get([ValueProvider(typeof(DummyValueProviderFactory))] string foo) {... }
我强烈建议您阅读this recent article以自定义Web Api绑定。
<强>更新强>
在阅读文章后,OP能够发现解决方案。这是因为它需要使用参数属性[ModelBinder]
才能工作。这是因为除非参数被注释,否则假设为[FromUri]
。一旦用[ModelBinder]
注释,就会执行注册的处理程序。