Setelah berjuang sepanjang malam akhirnya saya berhasil. Setelah beberapa debug saya menemukan masalah yang saya hadapi adalah bahwa klien saya mengirim permintaan Opsi preflight yang disebut untuk memeriksa apakah aplikasi diizinkan untuk mengirim permintaan posting dengan asal, metode dan header yang disediakan. Saya tidak ingin menggunakan Owin atau APIController, jadi saya mulai menggali dan menemukan solusi berikut hanya dengan ActionFilterAttribute. Terutama bagian "Akses-Kontrol-Izinkan Header" sangat penting, karena header yang disebutkan di sana harus cocok dengan header permintaan Anda akan kirim.
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MyNamespace
{
public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequest request = HttpContext.Current.Request;
HttpResponse response = HttpContext.Current.Response;
// check for preflight request
if (request.Headers.AllKeys.Contains("Origin") && request.HttpMethod == "OPTIONS")
{
response.AppendHeader("Access-Control-Allow-Origin", "*");
response.AppendHeader("Access-Control-Allow-Credentials", "true");
response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
response.End();
}
else
{
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
HttpContext.Current.Response.Cache.SetNoStore();
response.AppendHeader("Access-Control-Allow-Origin", "*");
response.AppendHeader("Access-Control-Allow-Credentials", "true");
if (request.HttpMethod == "POST")
{
response.AppendHeader("Access-Control-Allow-Methods", "GET, PUT, POST, DELETE");
response.AppendHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, X-RequestDigest, Cache-Control, Content-Type, Accept, Access-Control-Allow-Origin, Session, odata-version");
}
base.OnActionExecuting(filterContext);
}
}
}
}
Akhirnya, metode tindakan MVC saya terlihat seperti ini. Penting di sini adalah untuk juga menyebutkan Opsi HttpVerbs, karena jika tidak permintaan preflight akan gagal.
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
return Json(await DoSomething(model));
}