C# OData v4'中的字母数字字符串;s函数字符串参数被解析为int到string或null
我在传递字母数字字符串作为OData函数的参数时遇到一些问题。签名如下:C# OData v4'中的字母数字字符串;s函数字符串参数被解析为int到string或null,c#,asp.net-web-api,odata,odata-v4,C#,Asp.net Web Api,Odata,Odata V4,我在传递字母数字字符串作为OData函数的参数时遇到一些问题。签名如下: [EnableQuery] public IHttpActionResult GetForConstant([FromODataUri]string constant) 及其配置: var getForConstant = collection.Function("GetForConstant") .ReturnsFromEntitySet<BasicParameter>("Parameter
[EnableQuery]
public IHttpActionResult GetForConstant([FromODataUri]string constant)
及其配置:
var getForConstant = collection.Function("GetForConstant")
.ReturnsFromEntitySet<BasicParameter>("Parameters");
getForConstant.Parameter<string>("constant");
如果我尝试不使用单引号,我会得到一个406不可接受的错误
我尝试将WebAPI 2.2 for OData更新为最新版本(5.4.0),并将其更新为最新的ODataLib(6.10.0),但没有任何帮助
知道怎么了吗
如果有必要的话,我将WebAPI和MVC(用于帮助页面)混合在一起。以下是我的路由配置
MVC:
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 }
);
}
小田:
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})"]
你能给我们看一下函数的$metadata吗?@Brad我已将元数据添加到问题中。从你所显示的内容来看,一切都正常,但显然由于某种原因,你的字符串在提供给方法之前似乎被解析为数字。您是否使用任何自定义路由约定、模型绑定或类似的东西?除了在某种程度上混合了MVC和WebAPI之外,一切都是尽可能基本的。我已经在问题中添加了路由配置。嗯,WebApi和OData之间的重叠很有趣-我假设OData是先注册的?函数被调用的事实似乎表明这没关系。可以用来调试的是在函数[ODataRoute(“/Parameters/Default.GetForConstants(constant={constant})”上抛出ODataRoute属性看看这是否有帮助。如果有,那肯定是路由问题。我没有ODataRouteAttribute,所以这不起作用。有什么想法吗?显然问题223是用什么OData 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 }
);
}
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})"]