gpt4 book ai didi

c# - JsonServiceClient 不使用放置在 cookiecontainer 中的 cookie

转载 作者:行者123 更新时间:2023-11-30 17:51:34 38 4
gpt4 key购买 nike

我之前发布了几个问题以了解我现在的位置:

Reconnecting to Servicestack session in an asp.net MVC4 application

nullreference exception when adding session cookie to ServiceStack

应用程序的快速背景:这是一个访问远程服务堆栈安装上的数据的 asp.net MVC 应用程序。

此时我已成功通过 SS 进行身份验证,将 session key 保存在 cookie 中,并将该 cookie 插入到新 JsonServiceClient 实例的 CookieContainer 中。

然而,当我尝试通过新的 JsonServiceClient 实例获取一些数据时:

CallList = client.Get(new ServiceCallRequest()).Result;

远程 ServiceStack 实例似乎将我重定向到默认的 ASP 登录区域(/Auth/login 或类似的东西)。此重定向本身不是问题,但它似乎确实表明客户端未使用已在远程计算机上建立的 SS session 。

这是实际将 cookie 插入客户端 cookie 容器并调用对象列表的代码:

    public List<ServiceCallModel> LoadList()
{
try
{
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);
var client = new JsonServiceClient([api address]);
cookie.Domain = ".domain.com";
var cookie1 = new Cookie(SessionFeature.PermanentSessionId, cookie.Value);
cookie1.Domain = ".domain.com";
client.CookieContainer.Add(cookie1);

List<ServiceCallModel> CallList = new List<ServiceCallModel>();
CallList = client.Get(new ServiceCallRequest()).Result;
return CallList;
}
catch (Exception ex)
{
return new List<ServiceCallModel>();
}
}

我可以使用 C# 客户端验证此远程资源是否适用于单点触控 Android 应用程序。唯一的区别当然是 Android 客户端是持久的;这里有问题的不是。

上面的示例总是返回一个 WebServiceException(“未找到”)(我认为这实际上是一个 401/403,已被 ASP 烦人地重定向)。

这看起来合理吗,还是我遗漏/误解了 JsonServiceClient/ServiceStack 的某些功能?

非常感谢

更新

使用 Fiddler,我可以确认 cookie 已存储在浏览器中并在请求 header 中发送回 MVC 应用程序:

GET / HTTP/1.1
Host: [web app address]
Connection: keep-alive
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Cookie: ASP.NET_SessionId=3457C511FECBECCD3C055C21;.MONOAUTH=PzE6iBuLIbv1evgACfpUwpC1D7opCANroPDQN/mXHNvGAgkjqq04Tdd8EnnGTL7y3lWYWY4+GWaXGDT0Fm7+eJxRdpy LJMaUQ6BiYmb3dxRi1B3f/qkmPMbFIoC7vC9M; ss-pid=lzJ+o9vG/7F3YZ9JNN2F

在这一点上,我试图找出相同的 ss-pid 值,然后在请求 header 中将其返回到 API 服务器。

更新 2

使用 tcpdump 我能够看到 ss-pid 值实际上一直返回到 API 服务器(“远程 servicestack 实例”)。所以现在我认为我需要解决这个问题,而不是客户。有什么想法吗?

tcpdump 输出片段:

    0x0090:  6e65 740d 0a43 6f6f 6b69 653a 2073 732d  net..Cookie:.ss-
0x00a0: 7069 643d 6c7a 4a2b 6f39 7647 2f37 4633 pid=lzJ+o9vG/7F3
0x00b0: 595a 394a 4e4e 3246 0d0a 4163 6365 7074 YZ9JNN2F..Accept

我知道这篇文章的每个部分的 ss-pid 值是不同的。它们是在不同时间获得的

更新 3

我还更改了 vhost 配置文件中的 LogFormat,以吐出名为“ss-pid”的 cookie 的值(在日志条目的末尾)。

ServiceStack 远程 API 服务器上的结果日志如下所示:

172.16.0.17 - - [08/Oct/2013:12:26:52 -0400] "GET /sc/0 HTTP/1.1" 500 3082 "-" "-" "HFMtFpPQkpE0Br6/fEFg"
172.16.0.17 - - [08/Oct/2013:12:27:06 -0400] "GET /sc/0 HTTP/1.1" 302 394 "-" "-" "HFMtFpPQkpE0Br6/fEFg"
172.16.0.17 - - [08/Oct/2013:12:27:07 -0400] "GET /login.aspx?ReturnUrl=%2fsc%2f0 HTTP/1.1" 404 451 "-" "-" "HFMtFpPQkpE0Br6/fEFg"

第一个请求的“500”状态很明显。我现在将对此进行调查。

更新 4

500 状态似乎是 Microsoft.Web.Infrastructure.dll 被包含在 bin 目录中的情况。删除它以解决 500 响应,但这并没有解决整体问题。

最佳答案

ServiceStack 在请求中放置两个 session cookie,'ss-id' 和 'ss-pid'。您代码中的这一行...

var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);

将获取“ss-pid”cookie。但是,您可能想要获取“ss-id”cookie,这是您当前经过身份验证的 session 的 cookie。

var cookie = HttpContext.Request.Cookies.Get(SessionFeature.SessionId);

看看here有关 ServiceStack session 的更多信息。

关于c# - JsonServiceClient 不使用放置在 cookiecontainer 中的 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19235967/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com