Sau khi vật lộn cả buổi tối, cuối cùng tôi cũng có được việc này. Sau khi gỡ lỗi, tôi thấy vấn đề tôi gặp phải là khách hàng của tôi đã gửi một yêu cầu Tùy chọn preflight để kiểm tra xem ứng dụng có được phép gửi yêu cầu bài đăng với nguồn gốc, phương thức và tiêu đề được cung cấp không. Tôi không muốn sử dụng Owin hoặc APIControll, vì vậy tôi bắt đầu đào và tìm ra giải pháp sau chỉ với ActionFilterAttribution. Đặc biệt là phần "Kiểm soát truy cập-Cho phép-Tiêu đề" rất quan trọng, vì các tiêu đề được đề cập ở đó phải phù hợp với các tiêu đề mà yêu cầu của bạn sẽ gửi.
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);
}
}
}
}
Cuối cùng, phương thức hành động MVC của tôi trông như thế này. Điều quan trọng ở đây là cũng đề cập đến các Tùy chọn httpVerbs, vì nếu không, yêu cầu preflight sẽ không thành công.
[AcceptVerbs(HttpVerbs.Post | HttpVerbs.Options)]
[AllowCrossSiteJson]
public async Task<ActionResult> Create(MyModel model)
{
return Json(await DoSomething(model));
}