1

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);
    }
};

そしてプレスト、ブラウザのクッキー。

4

1 に答える 1

6
  • Cookie は常に空白ですが、ブラウザーにはいくつかの Cookie が存在することがはっきりとわかります。

  • 行われている呼び出しは、aspx ページのコード ビハインドから行われた、非常に標準的な JsonServiceClient POST 要求です。

上記の 2 つのコメントは、リクエストが他のソース (ブラウザやフィドラーなど) から発行されたときに、C# クライアントのリクエスト/レスポンス データがどのように共有されているか (短い答え: 違います) に混乱があるのではないかと考えさせられます。

ブラウザから page1.aspx へのリクエストを行い、分離コードに

var client = new JsonServiceClient("somewhere");

var response = client.Post(new RequestForStuff()); 

RequestForStuff サービスに追加されたすべての Cookie はclient変数/ServiceClientにのみ追加され、ブラウザへの応答の Cookie には追加されません。基本的に、(ブラウザーからの) 要求/応答内に (C# クライアントからの) 要求/応答があります。Cookie は 2 つの「相互作用」間で共有されません。

Cookie をclient変数から取り出して、元のリクエストからのレスポンスに追加することができます。

foreach(Cookie c in client.CookieContainer.GetCookies(newUri("https://sites.sub.domain.co.uk")))
{
    HttpContext.Current.Response.AppendCookie(new HttpCookie(c.Name, c.Value));           
}
于 2013-04-10T09:24:39.143 に答える