1. ホーム

[解決済み】ASP.Net MVCでAccess-Control-Allow-Originを設定する - 最もシンプルな方法

2022-04-07 15:30:39

質問

私はいくつかのjsonを返す単純なactionmethodを持っています。これは、ajax.example.comで実行されます。私は別のサイトsomeothersite.comからこれにアクセスする必要があります。

呼び出そうとすると、期待通りの......。

Origin http://someothersite.com is not allowed by Access-Control-Allow-Origin.

これを回避する方法は2つ知っています。 JSONP を作成し カスタムHttpHandler を使用します。 ヘッダを設定します。

もっと簡単な方法はないのでしょうか?

単純なアクションで、許可された起源のリストを定義することはできないのでしょうか? アクションフィルターとか?

最適なのは......。

return json(mydata, JsonBehaviour.IDontCareWhoAccessesMe);

解決方法は?

ASP.NET MVC コントローラの場合

新しい属性を作成する

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
        base.OnActionExecuting(filterContext);
    }
}

アクションをタグ付けします。

[AllowCrossSiteJson]
public ActionResult YourMethod()
{
    return Json("Works better?");
}

ASP.NET Web API用

using System;
using System.Web.Http.Filters;

public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        if (actionExecutedContext.Response != null)
            actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        base.OnActionExecuted(actionExecutedContext);
    }
}

APIコントローラ全体をタグ付けします。

[AllowCrossSiteJson]
public class ValuesController : ApiController
{

または個別のAPIコール。

[AllowCrossSiteJson]
public IEnumerable<PartViewModel> Get()
{
    ...
}

Internet Explorer v9の場合

IE <= 9はCORSをサポートしていません。私は、これらのリクエストを自動的にプロキシ経由でルーティングするJavaScriptを書きました。すべて100%透過的です(私のプロキシとスクリプトを含めるだけです)。

nugetでダウンロードする corsproxy をクリックし、同梱の説明書に従ってください。

ブログ記事 | ソースコード