2012-06-06 20 views
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%,數字爲30-%39%,連字符%2D,期限爲%2E,下劃線是%5F,代字號是%7E。

而這表明破折號是一個合法的字符,即將到來。不是我需要它。那麼,該規範的哪部分規定了允許的字符是什麼?

感謝您的幫助!

回答

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實現來做正確的事情。這就是爲什麼你看到它在某些情況下工作,而在某些情況下卻沒有。

+0

非常感謝你,Vitek!非常感謝您的幫助。 – object88