我之前发布了几个问题,以便了解我现在所处的位置:
Reconnecting to Servicestack session in an asp.net MVC4 application
和
nullreference exception when adding session cookie to ServiceStack
应用程序的快速背景:这是一个访问远程服务堆栈安装数据的asp.net MVC应用程序。
此时我已成功通过SS进行身份验证,将会话密钥保存在cookie中,并将该cookie插入新JsonServiceClient实例的CookieContainer中。
然而,当我尝试通过新的JsonServiceClient实例获取一些数据时:
CallList = client.Get(new ServiceCallRequest()).Result;
远程ServiceStack实例似乎将我重定向到默认的ASP登录区域(/ Auth / login或类似的东西)。此重定向本身不是问题,但它似乎表明客户端没有使用已在远程计算机上建立的SS会话。
这是实际将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(“Not Found”)(我假设它实际上是一个被ASP恼人地重定向的401/403)。
这看起来是否合理,或者我是否遗漏/误解了JsonServiceClient / ServiceStack的某些功能?
非常感谢
更新
使用Fiddler,我可以确认cookie存储在浏览器中并发送回请求头中的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值,然后将其返回到请求标头中的API服务器。
更新2
使用tcpdump我能够看到ss-pid值实际上是一直回到API服务器(“远程服务堆栈实例”)。所以现在我认为我需要排除故障,而不是客户端。有什么想法吗?
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状态似乎是bin.目录中包含Microsoft.Web.Infrastructure.dll的情况。删除了解决500响应,但这并没有解决整体问题。
答案 0 :(得分:1)
ServiceStack在Request,'ss-id'和'ss-pid'中放置两个Session cookie。代码中的这一行......
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);
将获取'ss-pid'cookie。但是,您可能希望获取'ss-id'cookie,这是您当前经过身份验证的会话的cookie。
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.SessionId);
有关ServiceStack会话的更多信息,请查看here。