У меня возникли проблемы с передачей буквенно-цифровой строки в качестве параметра для функции OData. Вот его подпись:
[EnableQuery]
public IHttpActionResult GetForConstant([FromODataUri]string constant)
и его конфигурация:
var getForConstant = collection.Function("GetForConstant")
.ReturnsFromEntitySet<BasicParameter>("Parameters");
getForConstant.Parameter<string>("constant");
и его метаданные:
<Function Name="GetForConstant" IsBound="true">
<Parameter Name="bindingParameter" Type="Collection(MyApp.BasicParameter)" />
<Parameter Name="constant" Type="Edm.String" Unicode="false" />
<ReturnType Type="MyApp.BasicParameter" />
</Function>
Вот различные проанализированные значения параметра метода контроллера «константа» с соответствующим вызовом:
http://xxx/api/Parameters/Default.GetForConstant(constant='123')
constant: "123"
http://xxx/api/Parameters/Default.GetForConstant(constant='999999999999999999999999999999999999999999999999')
constant: "1E+48"
http://xxx/api/Parameters/Default.GetForConstant(constant='12aa')
constant: "12"
http://xxx/api/Parameters/Default.GetForConstant(constant='aa')
constant: null
http://xxx/api/Parameters/Default.GetForConstant(constant='aa12')
constant: null
Если я попробую без одинарных кавычек, я получу ошибку 406 Not Acceptable.
Я попытался обновить WebAPI 2.2 для OData до последней версии (5.4.0), а также обновить до последней версии ODataLib (6.10.0), но это не помогло.
Есть идеи, что случилось?
Если это имеет значение, я смешиваю WebAPI и MVC (для справочных страниц). Вот мои настройки маршрутизации.
МВК:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( //MapRoute for controllers inheriting from standard Controller
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
Веб-API:
public static void Register(HttpConfiguration config)
{
config.Routes.MapHttpRoute( //MapHTTPRoute for controllers inheriting ApiController
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
OData:
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
var builder = new ODataConventionModelBuilder() { Namespace = "Default" };
*snip! model configurations here*
var model = builder.GetEdmModel();
config.MapODataServiceRoute("ODataRoute", "api", model);
}