現在の状況を把握するために、以前にいくつかの質問を投稿しました。
asp.net MVC4 アプリケーションで Servicestack セッションに再接続する
と
セッション Cookie を ServiceStack に追加するときの nullreference 例外
アプリの簡単な背景: これは、リモート サービス スタック インストール上のデータにアクセスする 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 ステータスは、Microsoft.Web.Infrastructure.dll が bin ディレクトリに含まれている場合のようです。500 応答を解決するためにそれを削除しましたが、全体的な問題は解決しませんでした。