web-dev-qa-db-ja.com

オプション405(許可されていないメソッド)web api 2

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);
    }
});

これを有効にするために他に必要なことはありますか?

23
user1987162

最後に、ajaxリクエストを変更することでこれを解決しました。 OPTIONSプリフライトは特定の状況でのみ送信されることがわかりました。リクエストの1つがContent-Typeこれは、次のタイプのいずれでもありません。

  • application/x-www-form-urlencoded
  • multipart/form-data
  • テキスト/プレーン

そのため、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);
    }
});

私はそれを機能させることができました。

このページには、単純なリクエストとプリフライトリクエストを回避する方法に関する有用な情報があります

1
user1987162

Nugetを使用して、プロジェクトのCORS Web APIパッケージをインストールします。

インストールパッケージMicrosoft.AspNet.WebApi.Cors

WebApiConfigで次の行を追加します。

var cors = new EnableCorsAttribute ("*", "*", "*");
config.EnableCors (cors);
23

これは私の問題を解決しました

ステップ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呼び出し元のアドレスに変更します

3
user2546477

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"/>
3
Code Uniquely

また、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);
     }
   });
0
Bilal