【问题标题】:alphanumeric string in OData v4's function string parameter is parsed as int into string, or nullOData v4 的函数字符串参数中的字母数字字符串被解析为 int 为字符串,或 null
【发布时间】:2015-04-07 00:11:09
【问题描述】:

我在将字母数字字符串作为 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 错误。

我尝试将 OData 的 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);
    }

【问题讨论】:

  • 你能告诉我们函数的$元数据吗?
  • @Brad 我已将元数据添加到问题中。
  • 从您所显示的内容来看,一切看起来都不错,但显然由于某种原因,您的字符串在提供给您的方法之前似乎被解析为数字。您是否在使用任何自定义路由约定、模型绑定器或类似的东西?
  • 除了稍微混合 MVC 和 WebAPI 之外,一切都是尽可能基本的。我已将路由配置添加到问题中。
  • 嗯,WebApi 和 OData 之间的重叠很有趣 - 我假设 OData 先注册?您的函数被调用的事实似乎表明没关系。您可以用作调试的方法是在函数 [ODataRoute("/Parameters/Default.GetForConstants(constant={constant})"] 上抛出 ODataRoute 属性,看看是否有帮助。如果有,它肯定建议路由问题。

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


【解决方案1】:

根据问题的评论链,路由约定填充函数参数的方式似乎在做一些奇怪的事情。由于基于属性的路由是第一个运行的,因此使用它似乎可以确保“正确的事情”发生。

要进一步缩小问题范围,需要对路由约定进行调试,以找出在这种情况下执行的操作,以及填充路由数据的操作。

所以同时,在函数中添加以下属性是可行的:

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

【讨论】:

  • 我没有 ODataRouteAttribute,所以这不起作用。有什么想法吗?
  • 显然问题 223 已通过 build 5.5 解决,您使用的是什么版本的 OData WebApi?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-27
相关资源
最近更新 更多