处理与Web API的会话

时间:2018-09-11 09:17:15

标签: c# asp.net-web-api

我有一个要求,我们的网站可以生成一个跟踪ID,以传递给用户以跟踪他们如何进入我们的网站。

该网站是Angular前端和.Net Web Api2后端,它们属于同一域

我的初始计划是使初始跟踪网址直接进入api(例如http://api.mywebsite.com/t/45mg9),然后返回到相关页面的重定向(例如http://web.mywebsite.com)。

重定向工作正常,但我想跟踪最初的跟踪代码,因为用户最初可能未登录,因此需要保留该跟踪代码,直到他们登录为止。

我尝试过:

曲奇饼

在重定向消息中,我使用以下方法设置了Cookie:

var response = new HttpResponseMessage(System.Net.HttpStatusCode.Redirect);
        response.Headers.Location = new Uri(tracking.Url);

        var cookie = new CookieHeaderValue("tracking", JsonConvert.SerializeObject(tracking))
        {
            HttpOnly = true,
            Path = "/",
            Domain = "mywebsite.com",
            Expires = DateTimeOffset.UtcNow.AddDays(30)
        };
response.Headers.AddCookies(new[] { cookie });
return ResponseMessage(response);

并且可以看到在重定向上设置的cookie,但是当Web应用程序随后对api进行调用时,它就不存在了。

会话

我已经在Web api中启用了会话并设置了该值,但似乎由于重定向而丢失了。


我想尝试将其保留在api中,因为我认为Web应用不需要知道所存储的信息,只有api感兴趣。

我该如何持久保存发送到api的信息(cookie,会话等)?我需要告诉网络应用将Cookie传递给api调用吗?

1 个答案:

答案 0 :(得分:0)

您可以通过添加带有跟踪ID的请求标头,在每个请求中从webapp向api重新发出跟踪ID。

在网络应用中,跟踪ID可以保存在Cookie或本地存储中。

要在标头中添加跟踪ID,请在每次调用api时使用httpinterceptor。

@Injectable()
 export class MyInterceptor implements HttpInterceptor {
constructor() { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    request = request.clone({
        setHeaders: {
            TrackingId: localStorage.getItem('trackingId')
        }
    });
    return next.handle(request);
   }
 }