我在将字母数字字符串作为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错误。
我尝试将ODAP的WebAPI 2.2更新到最新版本(5.4.0),并更新到最新的ODataLib(6.10.0),但这没有帮助。
知道什么是错的吗?
如果重要,我正在混合WebAPI和MVC(帮助页面)。这是我的路由配置。
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 }
);
}
的WebAPI:
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);
}
答案 0 :(得分:2)
根据问题的评论链,似乎路由约定填充函数参数的方式是做一些奇怪的事情。由于基于属性的路由是第一个运行,使用它似乎确保&#34;正确的事情&#34;发生的情况。
要进一步缩小问题范围,需要调试路由约定,以查找针对此方案执行的内容,以及它为填充路由数据所做的工作。
同时,将以下属性添加到函数中:
[ODataRoute("/Parameters/Default.GetForConstant(constant={constant})"]