1

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

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

谢谢你的帮助!

4

1 回答 1

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 实现来做正确的事情。这就是为什么您会看到它在某些情况下有效,而在某些情况下却无效。

于 2012-06-08T09:15:50.607 回答