跨站点ajax请求不起作用

时间:2013-06-03 12:26:03

标签: javascript jquery asp.net-mvc asp.net-web-api

您好我需要有两个独立的项目,一个是MVC项目,另一个是WEB API项目。两个项目将放在不同的解决方案中。

当我尝试从mvc项目向web api项目进行ajax调用时出现问题,我发现了这个错误:

OPTIONS http://localhost:54599/api/Account/IsCurrentUserAuthenticated 405
     

(方法不允许)jquery-1.9.1.min.js:5个选项   http://localhost:54599/api/Account/IsCurrentUserAuthenticated起源   Access-Control-Allow-Origin不允许http://localhost:61620。   jquery-1.9.1.min.js:5 XMLHttpRequest无法加载   http://localhost:54599/api/Account/IsCurrentUserAuthenticated。起源   Access-Control-Allow-Origin不允许http://localhost:61620

经过一番研究后,我想出了这个过滤器,它被添加到控制器中,我需要拨打电话:

 public class AllowCrossSiteJsonWebApiAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext filterContext)
    {
        filterContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

        string rqstMethod = filterContext.ActionContext.ControllerContext.Request.Method.Method.ToUpperInvariant();

        if (rqstMethod == "OPTIONS" || rqstMethod == "POST")
        {
            filterContext.Response.Headers.Add("Access-Control-Allow-Methods", "POST, OPTIONS");
            filterContext.Response.Headers.Add("Access-Control-Allow-Headers", "X-Requested-With, Accept, Access-Control-Allow-Origin, Content-Type");
        }

        if (rqstMethod == "OPTIONS")
        {
            filterContext.Response = new HttpResponseMessage(HttpStatusCode.OK);
            return;
        }

        base.OnActionExecuted(filterContext);
    }

    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext filterContext)
    {
        base.OnActionExecuting(filterContext);
    }
}

这是我从客户那里打来的电话:

 function fetch(url) {
    xhrFields = {
        withCredentials: true // pass auth cookies to server over ajax req
    };

    var options = {
        url: url,
        type: 'GET',
        contentType: "application/json; charset=utf-16",
        dataType: 'json',
        xhrFields: xhrFields
    };

    return $.ajax(options);
}

如何解决我的问题?

2 个答案:

答案 0 :(得分:2)

var options = {
        url: url,
        type: 'GET',
        contentType: "application/json; charset=utf-16",
        dataType: 'jsonp',
        xhrFields: xhrFields
    };

使用跨域时,您需要使用jsonp数据类型。

答案 1 :(得分:1)

您需要使用dataType: 'jsonp'进行跨域请求