我有一个简单的控制器,它带有一个无参数的 Get 和一个带有 id 的 Get。
public class BooksController : ApiController
{
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
public string Get(Identity id)
{
return "value";
}
}
Identity 是一个自定义结构,简化后如下所示:
public struct Identity
{
// ....
public Identity(Guid value)
{
internalValue = value;
}
}
但是,如果我尝试导航到任一端点,我会收到一条错误消息,指出找到了与请求匹配的多个操作。如果单个资源的 Get 采用 Guid 而不是我的 Identity 结构,则 BooksController 工作得很好。
我的自定义模型活页夹和接线:
public class IdentityModelBinder : IModelBinder
{
public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext)
{
Identity identity = new Identity(Guid.Parse(bindingContext.ValueProvider.GetValue(bindingContext.ModelName).AttemptedValue));
bindingContext.Model = identity;
return true;
}
}
GlobalConfiguration.Configuration.BindParameter(typeof(Identity), new IdentityModelBinder());
请注意,如果将任何参数添加到无参数 Get 中,则上述绑定很好。也就是说,如果我将 BooksController 更改为:
public class BooksController : ApiController
{
public IEnumerable<string> Get(int page, string searchTerm)
{
return new string[] { "value1", "value2" };
}
public string Get(Identity id)
{
return "value";
}
}
我的路由配置只是开箱即用的示例:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
然后我可以正确导航到两个端点。如何设置我的 BooksController 以允许无参数 Get 和接受我的自定义身份的 Get?