我已经实现了一个WCD数据服务/ OData服务器,实体设置为开放类型。我正在使用自定义IMetadataProvider,IQueryProvider等。我可以创建我的实体,设置打开属性,检索它们,更新和搜索 - 主要是。当我尝试在名称
中搜索类似“破折号”的属性时出现问题这有效:
GET /Service/Cases?$filter=ABC eq 'ABC'
这不起作用:
GET /Service/Cases?$filter=A-BC eq 'ABC'
这也不起作用:
GET /Service/Cases?$filter=A%2DBC eq 'ABC'
我收到以下错误:
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata">
<code />
<message xml:lang="en-US">Syntax error at position 7.</message>
</error>
(正如我所说,我能够获得一个名为破折号的开放财产的实体。并更新它等等。)
我猜想无论是解析URL还是将破折号解释为减法表达式,这都是有意义的。除非我正确读取OData规范,否则实体的属性名称由entitySimpleProperty定义(未在规范中定义,但我认为是entityProperty的拼写错误)...定义为* pchar,如RFC 3986第3.3节。反过来,评估为......
pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
pct-encoded = "%" HEXDIG HEXDIG
sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
/ "*" / "+" / "," / ";" / "="
当ALPHA为%41-%5A和%61-%7A时,DIGIT为%30-%39,连字符为%2D,周期为%2E,下划线为%5F,而波浪号为%7E。
这表明破折号是一个合法的角色,即将到来。不是我需要它。那么,规范的哪一部分规定了允许的字符是什么?
感谢您的帮助!
答案 0 :(得分:2)
根据CSDL(EDM)规则,属性必须有效。这允许任何有效的标识符,例如由这条XSD定义:
<xs:simpleType name="TSimpleIdentifier">
<xs:restriction base="xs:string">
<xs:maxLength value="480" />
<!-- The below pattern represents the allowed identifiers in ECMA specification -->
<xs:pattern value="[\p{L}\p{Nl}][\p{L}\p{Nl}\p{Nd}\p{Mn}\p{Mc}\p{Pc}\p{Cf}]{0,}" />
</xs:restriction>
</xs:simpleType>
它基本上是任何有效的编程语言标识符。不幸的是,OData规范可能有点令人困惑(或者甚至可能是错误的)。
请注意,在大多数情况下,WCF DS不会对此进行验证,因为验证检查会过于昂贵。它依赖于IDataServiceMetadataProvider实现来做正确的事情。这就是为什么你看到它在某些情况下工作,而在某些情况下则没有。