3

安らかなものやajaxなどは合計n00bなので、優しくしてください。

ServiceStack "Todo"サービスの例を取り上げ、このサービスをデータソースとして使用してモバイルクライアントを開発しようとしているという問題があります。WCF / WebAPIよりもSSの方が適していると思う特定のサービスを構築できるように、すべてがどのように機能するかを学ぼうとしています。

とにかく、サービスが実行されているとしましょう http://localhost:1234/api/todos 。他のさまざまな投稿にある情報を組み合わせて、CORSサポートを有効にしました。したがって、私の構成関数は次のようになります。

Plugins.Add(new CorsFeature());

            this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
            {
                httpRes.AddHeader("Access-Control-Allow-Origin", "*");
                //Handles Request and closes Responses after emitting global HTTP Headers
                if (httpReq.HttpMethod == "OPTIONS")
                {
                    httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
                    httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
                    httpRes.StatusCode = 204;
                    httpRes.End();
                }
            });

TodoServiceには次のようなサービスメソッドがあります。

[EnableCors]
        public object Post(Todo todo)
        {

            var t = Repository.Store(todo);
            return t;
        }

ブラウザの使用(FF / IE)このajax関数を呼び出すと:

var todo = { content: "this is a test" };
            $.ajax(
            {
                type: "POST",
                contentType: "application/json",
                data: JSON.stringify(todo),
                timeout:20000,
                url: "http://localhost:1234/api/todos",
                success: function (e) {
                    alert("added");
                    app.navigate("Todo");
                },
                error: function (x, a, t) {
                    alert("Error");
                    console.log(x);
                    console.log(a);
                    console.log(t);
                }
            }
            );

からhttp://localhost:1234、それからそれはすべてうまくいきます。ToDoが追加され、success関数の「e」には、サービスが作成した返されたTodoオブジェクトが含まれます。ただし、これを他の場所(http://localhost:9999つまり、モバイルクライアントアプリが実行されているasp.net devサーバー)から呼び出すと、Serviceメソッドが実行され、サーバー側でtodoが追加されても、jqueryへの応答が返されます。は空であり、すぐにエラー関数にヒットします。

私は何か馬鹿げたことをしていると確信していますが、私はそれを一生見ることができません。誰か手がかりがありますか?前もって感謝します...

更新:まあ、今は問題なく動作しているようですが、問題は

 httpRes.AddHeader("Access-Control-Allow-Origin", "*");

「OPTIONS」ブロックの外側。したがって、apphostで機能するコードは

Plugins.Add(new CorsFeature());
            this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
            {

                //Handles Request and closes Responses after emitting global HTTP Headers
                if (httpReq.HttpMethod == "OPTIONS")
                {
                    httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
                    httpRes.AddHeader("Access-Control-Allow-Origin", "*");
                    httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
                    httpRes.StatusCode = 204;
                    httpRes.End();
                }
            });
4

1 に答える 1

4

元のコードに問題があったことがわかりました。修正されたコードは次のとおりです。

Plugins.Add(new CorsFeature());
            this.RequestFilters.Add((httpReq, httpRes, requestDto) =>
            {

                //Handles Request and closes Responses after emitting global HTTP Headers
                if (httpReq.HttpMethod == "OPTIONS")
                {
                    httpRes.AddHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS");
                    //this line used to be outside the if block so was added to every header twice.                      
                    httpRes.AddHeader("Access-Control-Allow-Origin", "*");
                    httpRes.AddHeader("Access-Control-Allow-Headers", "X-Requested-With, Content-Type");
                    httpRes.StatusCode = 204;
                    httpRes.End();
                }
            });

そのため、CorsFeature() プラグインは、POST、GET のすべての COR を正しく処理しているように見え、プリフライト OPTIONS リクエストは RequestFilter によって処理されています (混乱 - なぜプラグインは OPTIONS リクエストだけを処理しないのですか?) ; 古いコードでは、リクエストごとに allow-origin ヘッダーが (プラグインとフィルターによって) 2 回追加されていたため、jquery またはブラウザーのどちらかが混乱していたようです。

私はこれを完全に理解しているわけではありません.私はいくつかの読書をする必要があります:)そして、私が使用しているモバイルフレームワーク(DXTreme)はJSONP以外のものを処理できないようです(クロスドメインの REST データ ソースには POST/PUT) が必要なので、既にプロキシ ルートに移動するか、フレームワークをダンプするか、問題を回避する別の方法を見つける必要があります。

于 2013-02-24T13:12:00.303 に答える