1

エンティティをオープンタイプとして設定して、WCD Data Services/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として定義されます。 RFC3986セクション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の仕様は、これに関して少し混乱する(または間違っている)可能性があります。

検証チェックは非常にコストがかかるため、ほとんどの場合、WCFDSはこれを検証しないことに注意してください。それは正しいことをするためにIDataServiceMetadataProvider実装に依存しています。そのため、動作する場合と動作しない場合があります。

于 2012-06-08T09:15:50.607 に答える