1

基本的な Breeze サンプルを DotNetNuke モジュールに含めようとしています (スタンドアロンの WebAPI プロジェクトでは正常に動作します)。簡単にするために、クライアントを削除し、Chrome ブラウザーで行った URL JSON 呼び出しのみを参照します。

メタデータとアイテムの完全なリストを見ることができ ます 。 /そよ風/あえて/トドス

ただし、URL からリストをフィルタリングしようとすると、常に完全なリストが返されます

MapHTTRoute を宣言した方法と関係があると思います。問題は、DotNetNuke モジュールに Global.ascx がないことです。BreezeWebApiconfig.cs ファイルを App_Start フォルダーにコピーしました。これはデバッグ時に起動しますが、DotNetNuke はルートを登録するメカニズムを使用します。

using DotNetNuke.Web.Api;

namespace SmartThinker.Modules.Framework
{
    public class RouteMapper : IServiceRouteMapper
    {
        public void RegisterRoutes(IMapRoute mapRouteManager)
        {
            mapRouteManager.MapHttpRoute("framework", "BreezeApi", "breeze/{controller}/{action}", new[] { "SmartThinker.Modules.Framework.Controllers" });
        }
    }
}

http://www.breezejs.com/documentation/web-api-controller#note01http://www.breezejs.com/documentation/web-api-routingを読みましたが、やるべきことのようですDNN がルートを登録する方法を使用します。BreezeWebApiConfig.csを使用せずにこれを行う方法はありますか?

私のコントローラー コードには BreezeController 属性があります。(サンプル クライアントをそれに接続すると、アイテムのリストが取得されます。フィルター処理が行われないだけなので、OData アクション フィルターに関係していると思います。問題がどこにあるかをデバッグするにはどうすればよいですか?

更新 1) メタデータは次のとおりです: http://www.ftter.com/desktopmodules/framework/api/dare/metadata

GetUsers メソッド: http://www.ftter.com/desktopmodules/framework/api/dare/getusers

および UserID でフィルタリングしようとする GetUsers メソッド (これは機能しません。これが問題です) http://www.ftter.com/desktopmodules/framework/api/dare/getusers?=UserID%20eq%204 http:/ /www.ftter.com/desktopmodules/framework/api/dare/GetUsersWithoutCors?=UserID%20eq%204 (これは IQueryable を返します)

コントローラーは次のとおりです。

[BreezeController]
public class DareController : DnnApiController
{
    private readonly EFContextProvider<FrameworkContext> contextProvider = new EFContextProvider<FrameworkContext>();

    [AllowAnonymous]
    [HttpGet]
    public HttpResponseMessage Metadata()
    {
        var response = Request.CreateResponse(HttpStatusCode.OK, contextProvider.Metadata());
        return GetResponseWithCorsHeader(response);
    }

    [AllowAnonymous]
    [HttpGet]
    public HttpResponseMessage GetUsers()
    {
        var userInfoController = new UserInfoController();

        var response = Request.CreateResponse(HttpStatusCode.OK, userInfoController.GetUsers());
        return GetResponseWithCorsHeader(response);
    }

    [AllowAnonymous]
    [HttpGet]
    public IQueryable<User> GetUsersWithoutCors()
    {
        return contextProvider.Context.Users;
    }
}
4

1 に答える 1

3

ルーティングは実際には Breeze の問題ではありません。サーバーがリクエストをコントローラーにルーティングする方法は、あなた次第です。私たちが独創的に行っていることは、無数にある方法の 1 つにすぎません。

コントローラーに[BreezeController]属性がありますか?ヒットできる場所にサンプルのエンドポイントを配置できますか? そこから何かヒントが得られるかもしれません。コントローラーも載せます。小さな例を実行する必要があります... メタデータを返す何かと IQueryable を返す 1 つのメソッド。

2013 年 6 月 25 日更新

[BreezeController]を返すメソッドを検出する方法でバグを発見したと思いますIQueryable<T>

属性は[BreezeController]Web API コントローラー メソッドをスキャンし、(実際には)[BreezeQueryable]を返すメソッドに属性を適用しますIQueryable<T>

[BreezeQueryable][Queryable]は、 $select、$expand、およびネストされた $orderby のサポートを追加するWeb API の拡張です ... 現在の[Queryable].

あなたのGetUsers()メソッドはHttpResponseMessageではなく を返すことがわかりIQueryable<User>ました。userInfoController.GetUsers()メソッド内のメソッドが を返すと仮定しましょうIQueryable<User>。そうしないと、OData クエリ パラメーターが適用されず、別の方向に進む必要があります。一緒に移動...

Breeze.WebApi.dll の v.1.3.6 で確認しましたが、HttpResponseMessageがラッピングされていることが検出されませんIQueryable<T>。そのため、クライアントの OData クエリ条件 (またはその他の OData 修飾子) は適用されません。この欠点 (私の意見では) はバグです。以下は同等の実装である必要があります。

[HttpGet]
public IQueryable<TodoItem> Todos() {
    return _repository.Todos;
}

[HttpGet]
public HttpResponseMessage TodosWrapped()
{
    return Request.CreateResponse(HttpStatusCode.OK, _repository.Todos);
}

2 番目の "ラップされた" メソッドは、OData クエリ パラメータを考慮しません。

幸いなことに、これが修正されるまでの回避策があります。次のように、属性を明示的に追加するだけ[BreezeQueryable]です...

[HttpGet]
[BreezeQueryable]
public HttpResponseMessage TodosWrapped()
{
    return Request.CreateResponse(HttpStatusCode.OK, _repository.Todos);
}

このアプローチが機能することを確認しました。

これを見つけてくれてありがとう。

OData クエリ構文を使用する

同僚は、クエリ URL が OData クエリ構文を使用していないことにも気付きました。あなたが書いた:

... /todos?=DareId%20eq%204

いつあるべきか

... /todos/?$filter=DareId%20eq%204

必ず使用してください?$filter=

于 2013-06-12T19:21:22.350 に答える