27

ASP.NET Web API アプリケーションですぐに使える ValuesController を使用しています

 public class ValuesController : ApiController
 {
     // GET api/values
     [Queryable(PageSize = 1)]
     public IQueryable<string> Get()
     {
         return new string[] { "value1", "value2", "value3", "value4", "value5" }.AsQueryable();
     }
 }

私がget http://localhost/api/values?$inlinecount=allpages

これが応答です

<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<string>value1</string>
</ArrayOfString>

コメントを外しましたconfig.EnableQuerySupport();

フィルタリング、ソートは正常に機能します。

試してみるget http://localhost/api/values?$inlinecount=XXXXXと例外が発生するので、Web API アプリケーションが認識しているようですinlinecount

<Message>The query specified in the URI is not valid.</Message>
<ExceptionMessage>'xxx' is not a valid value for $inlinecount.</ExceptionMessage> 
<ExceptionType>Microsoft.Data.OData.ODataException</ExceptionType>

私は間違いなく Microsoft.AspNet.WebApi.OData パッケージを持っています - これがパッケージ マネージャー コンソールの出力です

PM> Install-Package Microsoft.AspNet.WebApi.OData 
Attempting to resolve dependency 'Microsoft.Net.Http (= 2.0.20710.0 && < 2.1)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (= 4.0.20710.0 && < 4.1)'.
Attempting to resolve dependency 'Newtonsoft.Json (= 4.5.6)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (= 4.0.20710.0 && < 4.1)'.
Attempting to resolve dependency 'Microsoft.Data.OData (= 5.2.0 && < 5.3.0)'.
Attempting to resolve dependency 'System.Spatial (= 5.2.0)'.
Attempting to resolve dependency 'Microsoft.Data.Edm (= 5.2.0)'.
'Microsoft.AspNet.WebApi.OData 4.0.0' already installed.
WebServicesProject already has a reference to 'Microsoft.AspNet.WebApi.OData 4.0.0'.

助言がありますか?

4

2 に答える 2

27

素晴らしい質問です。

デフォルトの $inlinecount は、OData 応答を送り返す場合にのみ機能します。この理由は、OData が、XML および JSON が定義しないデータ内の特別なフィールドを定義するためです。したがって、OData では、応答は次のようになります。

{
  "odata.metadata":"http://localhost:12345/odata/$metadata#Customers",
  "odata.count":"4",
  "value":[ ... ]
}

「odata.count」プロパティを持つラッパーに注目してください。これは、デフォルトの XML および JSON フォーマッターがデータを書き出す方法とは異なります。これらのフォーマッターには、この追加情報のラッパーがないからです。したがって、他のフォーマッタはデフォルトで変更されていません。

いくつかのオプションがあります。

OData 形式の使用を選択できます。これについては、次のブログ投稿の手順に従ってください。

http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx

代わりに を返すこともできますPageResult<T>。これは次のようになります。

public PageResult<Customer> Get(ODataQueryOptions<Customer> queryOptions)
{
    IQueryable results = queryOptions.ApplyTo(_customers.AsQueryable());
    return new PageResult<Customer>(results as IEnumerable<Customer>, Request.GetNextPageLink(), Request.GetInlineCount());
}

これは、Count と次のページ リンクを含めることができる XML と JSON のラッパー オブジェクトを追加することで、OData、JSON、および XML に対して正常に機能するはずです。

于 2013-03-15T01:00:32.027 に答える