Web API 2を作成し、クロスドメインリクエストを実行しようとしていますが、次のエラーが表示されます。
オプション http://www.example.com/api/save 405(許可されていないメソッド)
私は見て回ったが、この問題のほとんどの解決策は、NuGetからCORをインストールして有効にする必要があると言っているため、パッケージをインストールし、コントローラーに
[EnableCors("*", "*", "*")]
しかし、これでも問題は解決していません。
私のApiController
には、次のSave
メソッドのみがあります。
[ResponseType(typeof(int))]
public IHttpActionResult Save(Student student)
{
if (ModelState.IsValid)
{
using (StudentHelper helper = new StudentHelper())
{
return Ok(helper.SaveStudent(student));
}
}
else
{
return BadRequest(ModelState);
}
}
これは別のドメインからの私のjsです:
$.ajax({
type: "POST",
crossDomain: true,
data: JSON.stringify(student),
crossDomain: true,
url: 'http://www.example.com/api/save',
contentType: "application/json",
success: function (result) {
console.log(result);
}
});
これを有効にするために他に必要なことはありますか?
最後に、ajaxリクエストを変更することでこれを解決しました。 OPTIONS
プリフライトは特定の状況でのみ送信されることがわかりました。リクエストの1つがContent-Type
これは、次のタイプのいずれでもありません。
そのため、ajaxリクエストでcontent-typeを削除し、次のように変更します。
$.ajax({
type: "POST",
crossDomain: true,
data: student,
dataType: 'json',
url: 'http://www.example.com/api/save',
success: function (result) {
console.log(result);
}
});
私はそれを機能させることができました。
Nugetを使用して、プロジェクトのCORS Web APIパッケージをインストールします。
インストールパッケージMicrosoft.AspNet.WebApi.Cors
WebApiConfigで次の行を追加します。
var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
これは私の問題を解決しました
ステップ1
CorsパッケージをインストールしますMicrosoft.AspNet.WebApi.Cors(ソリューション>右下のNugetパッケージの管理>そしてCorsの検索)
ステップ2
この行をWebApiConfig.csファイルに入れます
public static void Register(HttpConfiguration config)
{
config.EnableCors(new EnableCorsAttribute("http://localhost:3000", headers: "*", methods: "*"));
.
.
.
}
http:// localhost:30 をAPI呼び出し元のアドレスに変更します
Web.configで許可される動詞の1つとしてOPTIONSがあり、それがデフォルトハンドラーによって処理されていることを確認してください。
<system.web>
...
<httpHandlers>
...
<add path="*" verb="OPTIONS" type="System.Web.DefaultHttpHandler" validate="true"/>
<add path="*" verb="TRACE" type="System.Web.DefaultHttpHandler" validate="true"/>
<add path="*" verb="HEAD" type="System.Web.DefaultHttpHandler" validate="true"/>
また、withcredentials ajaxリクエストオプションを使用してみてください
$.ajax({
type: "POST",
crossDomain: true,
data: JSON.stringify(student),
withCredentials: true,
url: 'http://www.example.com/api/save',
contentType: "application/json",
success: function (result) {
console.log(result);
}
});