OData v4的函数字符串参数中的字母数字字符串被解析为int为string,或者为null

时间:2015-02-06 18:51:24

标签: c# asp.net-web-api odata odata-v4

我在将字母数字字符串作为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);
    }

1 个答案:

答案 0 :(得分:2)

根据问题的评论链,似乎路由约定填充函数参数的方式是做一些奇怪的事情。由于基于属性的路由是第一个运行,使用它似乎确保&#34;正确的事情&#34;发生的情况。

要进一步缩小问题范围,需要调试路由约定,以查找针对此方案执行的内容,以及它为填充路由数据所做的工作。

同时,将以下属性添加到函数中:

[ODataRoute("/Parameters/Default.GetForConstant(constant={constant})"]