Bütün bir akşam için mücadele ettikten sonra nihayet işe yaradı. Bazı hata ayıklama sonra içine yürüdü sorun bulundu müvekkilim, sağlanan kökeni, yöntemleri ve başlıkları ile bir gönderme isteği göndermek için izin verilip verilmediğini kontrol etmek için sözde ön kontrol seçenekleri isteği göndermek oldu. Owin veya bir APIController kullanmak istemedim, bu yüzden kazmaya başladım ve sadece bir ActionFilterAttribute ile aşağıdaki çözümü buldum. Özellikle "Erişim-Kontrol-İzin Ver-Başlıkları" bölümü çok önemlidir, çünkü burada belirtilen başlıkların isteğinizin göndereceği başlıklarla eşleşmesi gerekir.
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);
}
}
}
}
Son olarak, MVC eylem yöntemim böyle görünüyor. Burada önemli olan HttpVerbs Seçeneklerinden de bahsetmektir, aksi takdirde ön kontrol isteği başarısız olur.
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
return Json(await DoSomething(model));
}