安らかなものや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();
}
});