开放式实体上属性的合法字符

时间:2012-06-06 23:35:27

标签: wcf wcf-data-services odata

我已经实现了一个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。

这表明破折号是一个合法的角色,即将到来。不是我需要它。那么,规范的哪一部分规定了允许的字符是什么?

感谢您的帮助!

1 个答案:

答案 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实现来做正确的事情。这就是为什么你看到它在某些情况下工作,而在某些情况下则没有。