ASP.Net中关于WebAPI与Ajax进行跨域数据交互时Cookies数据的传递

本文涉及的产品
.cn 域名,1个 12个月
简介:

本文主要介绍了ASP.Net WebAPI与Ajax进行跨域数据交互时Cookies数据传递的相关知识。具有很好的参考价值。下面跟着小编一起来看下吧

 

前言

最近公司项目进行架构调整,由原来的三层架构改进升级到微服务架构(准确的说是服务化,还没完全做到微的程度,颗粒度没那么细),遵循RESTFull规范,使前后端完全分离,实现大前端思想。由于是初次尝试,中途也遇到了不少问题。今天就来讨论一下其中之一的问题,WebAPI与前端Ajax 进行跨域数据交互时,由于都在不同的二级域名下(一级域名相同),导致Cookies数据无法获取。

最开始通过头部(Header)将Cookies传输到其WebAPI,也能解决问题。

下面讲述另外一种解决方案。

解决过程:

步骤一:将Cookies的Domain(域)设置成一级域名,例如:“.wbl.com”(a.wbl.com域名下)

这是前提,此时在其中一个WebAPI中设置了Cookies后,用浏览器直接访问其它的WebAPI是可以获取到Cookies的。例如:a.wbl.com域名下设置的Cookies,用浏览器直接访问b.wbl.com域名的WebAPI是可以获取到Cookies的。但是用c.web.com域名下的Ajax访问b.wbl.com时,就无法获取到Cookies了,这是由于浏览器中Ajax的权限相对较低,Ajax无法跨域问题导致。

写入Cookies代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
   /// 给指定的 Cookies 赋值
   /// </summary>
   /// <param name="cookKey">Cookies 名称</param>
   /// <param name="value">Cookies 值</param>
   /// <param name="domain">设置与此 Cookies 关联的域(如:“.tpy100.com”)(可以使该域名下的二级域名访问)</param>
   public  static  void  SetCookiesValue( string  cookKey,  string  value,  string  domain)
   {
    HttpCookie cookie =  new  HttpCookie(cookKey);
    cookie.Value = value;
    cookie.HttpOnly =  true ;
    if  (! string .IsNullOrEmpty(domain) && domain.Length > 0)
     cookie.Domain = domain;
    HttpContext.Current.Response.Cookies.Add(cookie);
   }

步骤二:JQuery中Ajax使用Jsonp数据类型解决跨域问题(c.wbl.com域名下)

前后端需要定义统一的回调(Callback)函数名。

前端Ajax代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 设置Cookies
   function  set() {
    var  url =  "http://a.wbl.com/api/setvalue/888888" ;
    $.ajax({
     type:  "get" ,
     url: url,
     dataType:  "jsonp" ,
     jsonp:  "callbackparam" //服务端用于接收callback调用的function名的参数
     jsonpCallback:  "success_jsonpCallback" //callback的function名称
     success:  function  (json) {
      console.log(json);
      alert(json);
     },
     error:  function  () {
      alert( 'fail' );
     }
    });
   }
   // 获取Cookies
   function  get() {
    var  url =  "http://b.wbl.com/api/getvalue" ;
    $.ajax({
     type:  "get" ,
     url: url,
     dataType:  "jsonp" ,
     jsonp:  "callbackparam" //服务端用于接收callback调用的function名的参数
     jsonpCallback:  "success_jsonpCallback" //callback的function名称
     success:  function  (json) {
      console.log(json);
      alert(json);
     },
     error:  function  () {
      alert( 'fail' );
     }
    });
   }

步骤三:WebAPI中返回jsonp数据类型

Jsonp格式:

success_jsonpCallback({“Cookies”:”888888”})

由于这种格式与json格式有所不同,只用WebAPI里的返回IHttpActionResult或HttpRequestMessage类型不行,最后通过流的方式输出才实现了这个格式。

WebAPI代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[Route( "api/GetValue" )]
   [HttpGet]
   public  void  GetValue()
   {
    string  ccc = MyTools.Request.GetString( "callbackparam" );
    var  a =  new  { name =  "Cookies" , value = MyTools.Cookies.GetCookiesValue( "name" ) };
    string  result = ccc +  "({\"Cookies\":\""  + MyTools.Cookies.GetCookiesValue( "name" ) +  "\"})" ;
    //var response = Request.CreateResponse(HttpStatusCode.OK);
    //response.Content = new StringContent(result, Encoding.UTF8);
 
    HttpContext.Current.Response.Write(result);
    HttpContext.Current.Response.End();
    // return response;
   }
   [Route( "api/SetValue/{id}" )]
   [HttpGet]
   public  void  SetValue( int  id)
   {
    //string domain = "";
    string  domain =  ".wbl.com" ;
    MyTools.Cookies.ClearCookies( "name" , domain);
    MyTools.Cookies.SetCookiesValue( "name" , id.ToString(), domain);
 
    string  ccc = MyTools.Request.GetString( "callbackparam" );
    string  result = ccc +  "({\"result\":\"设置成功\"})" ;
 
    HttpContext.Current.Response.Write(result);
    HttpContext.Current.Response.End();
   }

最终效果:

后言:

这只是解决这个问题的一种方法。百度后还有一种通过第三方插件(Cross-Origin、Help Page)来处理的,后续在进行实验。

分类: ASP.NET, JAVASCRIPT
 
 
本文转自左正博客园博客,原文链接: http://www.cnblogs.com/soundcode/p/7233725.html /,如需转载请自行联系原作者
相关文章
|
20天前
|
消息中间件 存储 JSON
Net使用EasyNetQ简化与RabbitMQ的交互
EasyNetQ是专为.NET环境设计的RabbitMQ客户端API,简化了与RabbitMQ的交互过程。通过NuGet安装EasyNetQ,可轻松实现消息的发布与订阅,支持多种消息模式及高级特性。文中提供了详细的安装步骤、代码示例及基础知识介绍,帮助开发者快速上手。关注公众号“Net分享”获取更多技术文章。
29 1
Net使用EasyNetQ简化与RabbitMQ的交互
|
4月前
|
开发框架 JavaScript 前端开发
揭秘:如何让你的asp.net页面变身交互魔术师——先施展JavaScript咒语,再引发服务器端魔法!
【8月更文挑战第16天】在ASP.NET开发中,处理客户端与服务器交互时,常需先执行客户端验证再提交数据。传统上使用ASP.NET Button控件直接触发服务器事件,但难以插入客户端逻辑。本文对比此法与改进方案:利用HTML按钮及JavaScript手动控制表单提交。后者通过`onclick`事件调用JavaScript函数`SubmitForm()`来检查输入并决定是否提交,增强了灵活性和用户体验,同时确保了服务器端逻辑的执行。
58 5
|
1月前
|
开发框架 .NET 程序员
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
Autofac 是一个轻量级的依赖注入框架,专门为 .NET 应用程序量身定做,它就像是你代码中的 "魔法师",用它来管理对象的生命周期,让你的代码更加模块化、易于测试和维护
驾驭Autofac,ASP.NET WebApi实现依赖注入详细步骤总结
|
2月前
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
50 2
|
3月前
|
开发框架 监控 前端开发
在 ASP.NET Core Web API 中使用操作筛选器统一处理通用操作
【9月更文挑战第27天】操作筛选器是ASP.NET Core MVC和Web API中的一种过滤器,可在操作方法执行前后运行代码,适用于日志记录、性能监控和验证等场景。通过实现`IActionFilter`接口的`OnActionExecuting`和`OnActionExecuted`方法,可以统一处理日志、验证及异常。创建并注册自定义筛选器类,能提升代码的可维护性和复用性。
|
4月前
|
XML 开发框架 .NET
ASP.NET Web Api 如何使用 Swagger 管理 API
ASP.NET Web Api 如何使用 Swagger 管理 API
134 1
|
4月前
|
存储 开发框架 安全
ASP.NET WebApi 如何使用 OAuth2.0 认证
ASP.NET WebApi 如何使用 OAuth2.0 认证
|
4月前
|
开发框架 .NET 数据库连接
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
闲话 Asp.Net Core 数据校验(三)EF Core 集成 FluentValidation 校验数据例子
100 1
|
4月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
74 0