mvc webapi跨域帖子

Dmi*_*ryL 15 cors asp.net-web-api

可能重复:
使用WebAPI for XmlHttpRequest的CORS



我正在尝试将跨域ajax帖子实现到我的webApi项目中.我没有遇到什么麻烦:
1.在改变我的webapi动作之前,我总是遇到204错误

public void submit(Submission model)
Run Code Online (Sandbox Code Playgroud)

public bool submit(Submission model)
Run Code Online (Sandbox Code Playgroud)

不知道为什么,但现在我得到200 OK状态

2.仍然是我的ajax发射错误回调.

很久以前,我通过添加解决了跨域发布的这种错误

HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
Run Code Online (Sandbox Code Playgroud)

到我的控制器.但现在在webApi我是固有的: ApiController ,这个技巧不起作用.显示我Error an object reference is required for the non-static field, method, or property"System.Web.HttpContext.Response.get"

试图发布的编译器,dataType: 'JSONP'但我得到了null模型.

这里有Javascript请求:

var model = {
        "type": $("#model-type").val(),
        "subject": $("#subject-text").val(),
        "body": $("#body-text").val()
    };

    $.ajax({
        type: "POST",
        dataType: 'JSONP',
        url: $("#submit-url").val(),
        data: model,
        success: function () {
            alert("Succesfully submitted");
        },
        error: function () {
            alert("Error...");
        }
    });

我做错了什么?

解决了

感谢大家帮助我.我在其中一条评论链接中找到了解决方案.我使用了以下方法,我觉得很简单.

来源:
在ASP.NET Web API中实现CORS支持


我做了什么:

1.在我的项目中创建了新的类:CorsHandler.cs并且只是复制粘贴以下代码:


public class CorsHandler : DelegatingHandler
    {
        const string Origin = "Origin";
        const string AccessControlRequestMethod = "Access-Control-Request-Method";
        const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
        const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
        const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
        const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

        protected override Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            bool isCorsRequest = request.Headers.Contains(Origin);
            bool isPreflightRequest = request.Method == HttpMethod.Options;
            if (isCorsRequest)
            {
                if (isPreflightRequest)
                {
                    return Task.Factory.StartNew(() =>
                    {
                        HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
                        response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

                        string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
                        if (accessControlRequestMethod != null)
                        {
                            response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
                        }

                        string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
                        if (!string.IsNullOrEmpty(requestedHeaders))
                        {
                            response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
                        }

                        return response;
                    }, cancellationToken);
                }
                else
                {
                    return base.SendAsync(request, cancellationToken).ContinueWith(t =>
                    {
                        HttpResponseMessage resp = t.Result;
                        resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
                        return resp;
                    });
                }
            }
            else
            {
                return base.SendAsync(request, cancellationToken);
            }
        }
    }

Run Code Online (Sandbox Code Playgroud)
  1. 打开我Global.asax并修改 Application_Start:

protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);

            GlobalConfiguration.Configuration.MessageHandlers.Add(new CorsHandler());
        }

Run Code Online (Sandbox Code Playgroud)

注意最后一行.

此方法与MVC3和.NET 4.0兼容.效果很好,现在我可以处理ajax中的"成功"和"错误"回调.

Kev*_*tch 0

如果你想从 ajax 发送信息到另一个域,那么你需要使用 jsonp (注意这仅适用于 get 请求,不适用于 post 请求)。另一种选择(如果您控制两个域)是使用 ARR(应用程序请求路由)来欺骗浏览器,使其认为请求是本地的,然后使用 ARR 将请求重写到另一个域。使用这种技术,您可以像平常一样使用简单的 ajax 获取和发布。