【发布时间】:2015-08-24 11:45:58
【问题描述】:
我正在 Web API OData 中构建一个服务层,它公开了一个文件管理 API。我对可组合函数有疑问。考虑以下场景。可以通过两种方式访问特定文件:通过ID 或通过复杂的Path。我最初的设计理念是有两个 URL:
/File({IdAsGuid})/Repositories({RepositoryName})/Libraries({libName})/Path({path})/api.getFileByName(name={fileName})
使用ODataRoute 属性效果很好。下一步是支持版本,这将使用 URL 之类的:
/File({IdAsGuid})/Versions({versionNumber})/Repositories({RepositoryName})/Libraries({libName})/Path({path})/api.getFileByName(name={fileName})/Versions({versionNumber})
使用EntitySet“版本”作为路径段没有问题或第一个URL。但是,OData 拒绝验证函数调用后使用的EntitySet。错误:
段“eBesNg.getContentByName”必须是最后一段 URI,因为它是以下之一:$ref、$batch、$count、$value、 $metadata,命名媒体资源,动作,不可组合 函数、动作导入、不可组合函数导入、 具有 void 返回类型的操作,或具有 void 的操作导入 返回类型。
经过一番研究,我意识到函数定义如下:
builder.Namespace = "api";
var function = builder.EntityType<Path>().Function("getFileByName");
function.Parameter<string>("name");
function.ReturnsFromEntitySet<File>("Files");
并且可能还需要:
function.IsComposable = true;
但是,这产生了一个不同的问题。现在,在 OData 验证期间,我收到了 NullReferenceException:
[NullReferenceException:对象引用未设置为对象的实例。]
Microsoft.OData.Core.UriParser.Parsers.ODataPathParser.CreatePropertySegment(ODataPathSegment 上一个,IEdmProperty 属性,字符串 queryPortion) +205
Microsoft.OData.Core.UriParser.Parsers.ODataPathParser.CreateNextSegment(字符串 文字)+405
Microsoft.OData.Core.UriParser.Parsers.ODataPathParser.ParsePath(ICollection'1 段)+244
Microsoft.OData.Core.UriParser.Parsers.ODataPathFactory.BindPath(ICollection'1 段,ODataUriParserConfiguration 配置)+96
Microsoft.OData.Core.UriParser.ODataUriParser.ParsePathImplementation() +205
我错过了什么?是否不能使用导航功能和继续导航 OData 中的结果?
【问题讨论】:
标签: c# asp.net asp.net-web-api odata