ServiceStack と Cookie に問題があります。組み込みの C# JsonServiceClient から、サービスで Cookie を読み取ることも設定することもできません。
Web サービスは、このドメインで SSL で実行されています。
https://sites.sub.domain.co.uk/Api/
サービスを呼び出す Web サイトは次の場所にあります。
https://sites.sub.domain.co.uk/Website/
サービスに Cookie を設定しようとすると、次のようになります。
this.Response.Cookies.AddCookie(cookie);
wherecookie
が のドメインで設定されている場合.domain.co.uk
、何も起こりません。サービスは期待どおりに実行され、期待される応答を返しますが、Cookie は設定されておらず、例外はありません。
res
また、提供されたオブジェクトを使用して、応答フィルターでこれを実行しようとしましたが、同じ結果が得られました。
第 2 に、ac# クライアントを使用してサービスが呼び出されると、Cookie も送信されないように見えます。AppHost で、リクエストごとにリクエスト全体をログアウトしています。
RequestFilters.Add((req, res, dto) => { Log(req.Cookies); });
Cookie は常に空白ですが、ブラウザーにはいくつかの Cookie が存在することがはっきりとわかりますCookie
。
JsonServiceClient
POST
行われている呼び出しは、aspx ページのコード ビハインドから行われる非常に標準的な要求です。
var client = new JsonServiceClient("somewhere");
var response = client.Post(new RequestForStuff());
どんな提案でも大歓迎です。
アップデート
調査中に、HTMLフォームの投稿を介してサービスの1つを呼び出しましたが、リクエストをログに記録するまでにCookieコレクションが含まれています...表示されると予想されるCookieはすべてそこにあります...
別のアップデート
さまざまな手段を使用してサービスのテストを続けました。Chrome で REST コンソールを使用する場合、Cookie はブラウザーによって送信され、応答で作成しようとしている Cookie は両方とも正しく機能していますが、同じ引数で同じサービスを呼び出すと、ac# からJsonServiceClient、Cookie は送信も設定もされません。
成功したリクエスト (REST コンソールから) のヘッダー (ログ ファイルで json にシリアル化):
{
"Header": "Connection",
"Value": "keep-alive"
},
{
"Header": "Content-Length",
"Value": "124"
},
{
"Header": "Content-Type",
"Value": "application/json"
},
{
"Header": "Accept",
"Value": "application/json"
},
{
"Header": "Accept-Charset",
"Value": "ISO-8859-1,utf-8;q=0.7,*;q=0.3"
},
{
"Header": "Accept-Encoding",
"Value": "gzip,deflate,sdch"
},
{
"Header": "Accept-Language",
"Value": "en-GB,en-US;q=0.8,en;q=0.6"
},
{
"Header": "Cookie",
"Value": massive load of stuff...
},
{
"Header": "Host",
"Value": "sites.sub.domain.co.uk"
},
{
"Header": "User-Agent",
"Value": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.43 Safari/537.31"
},
{
"Header": "Origin",
"Value": "chrome-extension://cokgbflfommojglbmbpenpphppikmonn"
}
そして、失敗した c# クライアント呼び出しから:
{
"Header": "Content-Length",
"Value": "124"
},
{
"Header": "Content-Type",
"Value": "application/json"
},
{
"Header": "Accept",
"Value": "application/json"
},
{
"Header": "Accept-Encoding",
"Value": "gzip,deflate,gzip, deflate"
},
{
"Header": "Expect",
"Value": "100-continue"
},
{
"Header": "Host",
"Value": "sites.sub.domain.co.uk"
}
リクエストのヘッダーをいじってみました:
JsonServiceClient.HttpWebRequestFilter = f => f.Headers.Add(...
しかし、役に立たない。
修正して更新
paacshpa からの回答に従って、このコードをクライアントに入れました。
JsonServiceClient.HttpWebResponseFilter = d =>
{
foreach (Cookie co in d.Cookies)
{
var htc = new HttpCookie(co.Name, co.Value) { Domain = co.Domain, Path = "/" };
HttpContext.Current.Response.Cookies.Add(htc);
}
};
そしてプレスト、ブラウザのクッキー。