使用Jquery调用WEB API和MVC时的跨域问题

      使用Jquery请求API时,某些浏览器下会提示跨域问题:

XMLHttpRequest cannot load http://localhost:25833/api/values/1. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.
XHR failed loading: GET "http://localhost:25833/api/values/1".

在WEB API中的解决方法:

1. 先设置API返回Json格式:

GlobalConfiguration.Configuration.Formatters.XmlFormatter.SupportedMediaTypes.Clear();

2. 增加跨域特性:

复制代码
    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            if (actionExecutedContext.Response != null)
                actionExecutedContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");
            base.OnActionExecuted(actionExecutedContext);
        }
    }
复制代码

3. 使用这个特性:

        [AllowCrossSiteJson]
        public HttpResponseMessage Get(int id)
        {
            string json = "{\"result\":\"true\"}";
            return new HttpResponseMessage { Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json") };
        }

在MVC中的解决方法是:

1. 创建一个特性:

    public class AllowCrossSiteJsonAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            filterContext.RequestContext.HttpContext.Response.AddHeader("Access-Control-Allow-Origin", "*");
            base.OnActionExecuting(filterContext);
        }
    }

2. 使用这个特性:

        [AllowCrossSiteJson]
        public JsonResult YourMethod()
        {
            Test t = new Test { Name="aaa",Value="bbb"};
            return Json(t,JsonRequestBehavior.AllowGet);
        }

 

使用Jquery访问代码如:

 

复制代码
    <script>
    $(document).ready(function(){
      $("button").click(function(){
        $.ajax({
            type:"Get",
            url:"http://localhost:25833/Home/YourMethod",
            dataType: "json",
            success: function (result){
                alert("数据:" + result.Name + "\n状态:" + status);
             }
        });
      });
    });
    </script>
复制代码

通过上述设置之后可以在IE、火狐、谷歌下面顺利访问。

 

posted @   石曼迪  Views(618)  Comments(0Edit  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
瓴域建设-环保事业中心
点击右上角即可分享
微信分享提示