webApi プロジェクトにクロスドメイン ajax 投稿を実装しようとしています。
1. webapiアクションを変更するまで、常に204エラーが発生
していました。
public void submit(Submission model)
に
public bool submit(Submission model)
理由はわかりませんが、200 OK
ステータス
2 を取得しています。まだ ajax 起動エラー コールバックです。
3.ずっと前に、この種のクロスドメイン投稿のエラーを追加して解決しました
HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
私のコントローラーに。しかし、今では webApi に固有のもので: ApiController
あり、このトリックは機能しません。Error an object reference is required for the non-static field, method, or property"System.Web.HttpContext.Response.get"
経由で投稿しようとしたコンパイラを表示しますdataType: 'JSONP'
が、null モデルを取得します。
Javascript リクエストは次のようになります。
変数モデル = { "type": $("#model-type").val(), "subject": $("#subject-text").val(), "body": $("#body-text").val() }; $.ajax({ タイプ: "ポスト", データ型: 'JSONP', URL: $("#submit-url").val(), データ・モデル、 成功: 関数 () { alert("正常に送信されました"); }、 エラー: 関数 () { alert("エラー..."); } });
私が間違っていることは何ですか?
解決した
私を助けてくれたみんなに感謝します。コメントリンクの1つで解決策を見つけました。私は次のアプローチを使用しましたが、これは非常に簡単だと思います。
出典:
ASP.NET Web API での CORS サポートの実装
私が作ったもの:
1.プロジェクトに新しいクラスを作成しました:CorsHandler.cs
そして次のコードをコピーして貼り付けました:
public class CorsHandler : DelegatingHandler
{
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";
protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
bool isCorsRequest = request.Headers.Contains(Origin);
bool isPreflightRequest = request.Method == HttpMethod.Options;
if (isCorsRequest)
{
if (isPreflightRequest)
{
return Task.Factory.StartNew(() =>
{
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
if (accessControlRequestMethod != null)
{
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
}
string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
{
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}
return response;
}, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith(t =>
{
HttpResponseMessage resp = t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
});
}
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}
- 私
Global.asax
を開い て変更しましたApplication_Start
:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
}
アクションの最後の行に注意してください。
このアプローチは、MVC3 および .NET 4.0 と互換性があります。うまく機能し、ajax で「成功」と「エラー」のコールバックを処理できるようになりました。