gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:34:33 32 4
gpt4 key购买 nike

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

以下是关联调用的“常量” Controller 方法参数的不同解析值:

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 }
);
}

网络接口(interface):

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 }
);
}

数据:

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);
}

最佳答案

根据对该问题的评论链,路由约定填充函数参数的方式似乎有些奇怪。由于基于属性的路由是最先运行的,使用它似乎可以确保“正确的事情”发生。

要进一步缩小问题的范围,需要调试路由约定,以找到针对此场景执行的是哪个,以及它正在做什么来填充路由数据。

因此同时,向函数添加以下属性:

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

关于c# - OData v4 的函数字符串参数中的字母数字字符串被解析为 int 为字符串,或者为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28372757/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com