0

Breeze を使用してクライアントから呼び出される応答に CORS ハンドラーを追加するメソッドを使用します。

ここでどのように機能するようになったかについて詳しく読むことができます: Controller not filtering data in Breeze query in DotNetNuke Module

ただし、$filter は機能しますが、$expand と $selectは機能しないことに気付きました。

したがって、私の質問は次のとおりです。HttpResponseMessage タイプを返し、Breeze を使用するにはどうすればよいですか (CORS でこれを行う必要があります)。

これを証明するために、Todos サンプルをダウンロードして変更しました。

オリジナルメソッド(作品)

http://example/api/todos/todos?$select=isdone
[HttpGet]
public IQueryable<TodoItem> Todos()
{
    return _contextProvider.Context.Todos;
}

CORSラッパーを使用した私の方法(展開または選択しません)

http://example/api/todos/TodosCors?$select=isdone
[HttpGet]
[Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
public HttpResponseMessage TodosCors()
{
    var response = Request.CreateResponse(HttpStatusCode.OK, (IQueryable<TodoItem>)_contextProvider.Context.Todos);
    return ControllerUtilities.GetResponseWithCorsHeader(response);
}

    public static HttpResponseMessage GetResponseWithCorsHeader(HttpResponseMessage response)
    {
        response.Headers.Add("Access-Control-Allow-Origin", "*");
        return response;
    }
4

1 に答える 1

1

主にあなたの質問の CORS の側面についてコメントします。$expand と $select に関する部分は、参照先の StackOverflow question で説明されています。簡単に言えば、[Queryable]$expand と $select をサポートしない Web API 属性です。[BreezeQueryable]する属性が必要だと思います。

確かなことは言えませんが、表示されているコードが Web API の CORS を実装する適切な方法であるとは思いません。少なくとも私はそれがこのように行われたのを見たことがありません。

私が知っている方法は 2 つあります。どちらもメッセージ ハンドラの追加を伴います。

1 つ目は、Breeze Todo サンプルで行った方法です。2 つ目は、進行中の Web API CORS サポートです。

私たちが行った方法は単純ですが効果的です。それについては、承認された Web API の方法に任せるつもりなので、それについては話しません (すぐに期待します)。

Todo デモで、App_Start/ BreezeSimpleCorsHandler.csを探します。名前空間以外は変更せずに、独自の App_Start フォルダーにコピーするだけです。

次に、サーバーはそれを呼び出す必要があります。Todo サンプルでは、​​BreezeWebApiConfig.csでこれを行いましたが、Global.asaxまたはサーバー ブート ロジックの一部である任意の場所に配置できます。

      // このサーバーで有効になっている CORS
      GlobalConfiguration.Configuration.MessageHandlers.Add(新しい BreezeSimpleCorsHandler());

たまたま、近日公開予定の Web API CORS NuGet パッケージで Breeze を試したところ、Breeze にバグが発見されました。私たちはそれをやり遂げなければなりません...そして私たちはそうします。私たちは、その方法がその方法であることを本当に望んでいます。

それまでは、Todo サンプルの先例に従うことができます。

于 2013-07-05T00:12:42.320 に答える