4

私は、WebHttpBinding を使用して、WCF セルフ ホスト コンソール アプリ REST サービスから Cookie を書き込む最速の方法に取り組んでいます。「Cookie の設定」を準備しましたが、ブラウザー (Windows で FireFox 11.0 を使用) と「有効期限」の値に最初の Cookie のみが設定されます。

var expiry = DateTime.Now.AddMonths( 6 );
var outresp = WebOperationContext.Current.OutgoingResponse;
outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13; cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );

また、最初の Cookie と 2 番目の Cookie の間にコンマを入れてみましたが、どちらも機能しませんでした。

outresp.Headers.Add( HttpResponseHeader.SetCookie , "cookie1=fd9416ea-2705-4d44-be76-f2f7b95e6b13;, cookie2=7d489e69-d9c9-4b8d-a4b1-bce0da1c5966;expires=" + expiry );

これを切り詰めて、Fiddler を起動しました。

outresp.Headers.Add( HttpResponseHeader.SetCookie , "foo=foovalue;,bar=barvalue;" );

そしてフィドラーはこれを示しています:

Response sent 27 bytes of Cookie data:
    Set-Cookie: foo=foovalue;,bar=barvalue;

This response did not contain a P3P Header.

Validate P3P Policies at: http://www.w3.org/P3P/validator.html
Learn more at: http://www.fiddler2.com/redir/?id=p3pinfo

これは、ブラウザーが Cookie を受け入れられるようにするために .NET 側でフォーマットしていないことを示しています。

すべての Cookie を最初の値だけのブラウザー insetad に取得するにはどうすればよいですか? 私は何を取りこぼしたか?

ありがとう。

[ 編集 ]

この問題を Microsoft にサポートを依頼したところ、次のことがわかりました。

「Set-Cookie」が単一の Cookie 行に変更されているという事実は、Microsoft 内で .NET Framework 4.0 および Framework 4.5 のバグとして記録されています。Microsoft WCF 開発グループ内では、このバグは「解決済み」および「修正予定なし」としてリストされています。
Microsoft によると、唯一の回避策は、自己ホストから IIS 内でのホスティングに移行し、(IIS) Response オブジェクトを直接使用することです (バグのない別のコード パス)。

4

2 に答える 2

0

@ jeff-fischer の回答を拡張するには、AspNetCompatibilityMode が機能し、次のものが必要です。

AspNetCompatibilityRequirementsサービス クラスが次のいずれかに設定されAllowedますRequired

[AspNetCompatibilityRequirements(RequirementsMode
       = AspNetCompatibilityRequirementsMode.Allowed)]
public class AppService : IAppService

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />に設定されています<system.serviceModel>

これにより、アクセスが許可されHttpContext(これにアクセスする必要がありますusing System.Web;)、次を使用してCookieを設定できます。

var aCookie = new HttpCookie("foo")
{
    HttpOnly = true,
    Value = "bar",
    Expires = DateTime.Now.AddDays(1)
};

HttpContext.Current.Response.Cookies.Add(aCookie);

これは、WCF ランチャーではなく IIS でアプリケーションとして実行する必要があり、複数の Cookie が設定されている場合は、複数の Cookie ヘッダーが実際に表示されます。

于 2015-12-17T11:41:37.657 に答える