JsonServiceClient не использует куки, помещенные в cookiecontainer
Ранее я отправил пару вопросов, чтобы узнать, где я сейчас нахожусь:
Переподключение к сеансу Servicestack в приложении asp.net MVC4
а также
исключение nullreference при добавлении сеансового cookie в ServiceStack
Краткая справочная информация о приложении: это MVC-приложение asp.net, которое получает доступ к данным при удаленной установке стека служб.
На этом этапе я успешно аутентифицируюсь с помощью SS, сохраняю ключ сеанса в cookie и вставляю этот cookie в CookieContainer нового экземпляра JsonServiceClient.
Однако, когда я пытаюсь получить некоторые данные через новый экземпляр 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>();
}
}
Я могу убедиться, что этот удаленный ресурс работает с приложением для Android с одним касанием, используя клиент C#. Разница, конечно, в том, что клиент Android постоянен; рассматриваемый здесь не.
Приведенный выше пример всегда возвращает исключение WebServiceException ("Not Found") (которое, как я полагаю, на самом деле является 401/403, которое было перенаправлено ASP.
Это кажется разумным, или я упускаю / неправильно понимаю некоторые функции 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
Я также изменил LogFormat в конфигурационном файле vhost, чтобы выдавать значение для cookie, называемого "ss-pid" (в конце записи журнала).
Получающиеся журналы на удаленном сервере API ServiceStack выглядят следующим образом:
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 ответ, но это не решило общую проблему.
1 ответ
ServiceStack помещает два файла cookie сеанса в запрос, ss-id и ss-pid. Эта строка в вашем коде...
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);
возьмет печенье 'ss-pid'. Но вы, вероятно, хотите получить cookie "ss-id", который является файлом cookie для вашей текущей аутентифицированной сессии.
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.SessionId);
Посмотрите здесь для получения дополнительной информации о сеансах ServiceStack.