পুরো সন্ধ্যার জন্য লড়াই করার পরে অবশেষে আমি এটি কাজে পেলাম। কিছুটা ডিবাগিংয়ের পরে আমি যে সমস্যাটি চালাচ্ছিলাম তা হ'ল আমার ক্লায়েন্টটি তথাকথিত উত্স, পদ্ধতি এবং শিরোনামগুলির সাথে পোস্টের অনুরোধ প্রেরণ করার অনুমতি দেয় কিনা তা পরীক্ষা করার জন্য একটি তথাকথিত প্রিফলাইট বিকল্পগুলির অনুরোধ পাঠাচ্ছিল। আমি ওউইন বা একটি অ্যাপিকন্ট্রোলার ব্যবহার করতে চাইনি, তাই আমি খনন শুরু করেছিলাম এবং কেবলমাত্র একটি অ্যাকশনফিলারঅ্যাট্রিবিউট দিয়ে নিম্নলিখিত সমাধানটি নিয়ে এসেছি। বিশেষত "অ্যাক্সেস-কন্ট্রোল-মঞ্জুরি-শিরোনামগুলি" অংশটি খুব গুরুত্বপূর্ণ, কারণ সেখানে উল্লিখিত শিরোনামগুলির সাথে আপনার অনুরোধ প্রেরিত শিরোনামগুলির সাথে মিল রাখতে হবে।
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);
}
}
}
}
অবশেষে, আমার এমভিসি অ্যাকশন পদ্ধতিটি এর মতো দেখাচ্ছে। গুরুত্বপূর্ণ এখানে অপশন এইচটিটিপি ভার্বসের কথাও উল্লেখ করা হয়েছে, কারণ অন্যথায় প্রিফলাইট অনুরোধটি ব্যর্থ হবে।
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
return Json(await DoSomething(model));
}