WCF Data Services で HTTPレスポンスヘッダにアクセスしたい

だいぶ前にWCF Data ServicesでForm認証をやりましたが、Cookieで認証してるんだからいずれCookieの期限が切れるわけです。

で、ASP.NETではCookieの自動更新を有効にするためのフラグ(slidingExpiration)があり、このフラグをtrueにしておくことで期限が半分過ぎた後にアクセスがあると、新しいCookieを発行してくれるようになります。
(レスポンスヘッダの”Set-Cookie”に新しいCookieが付与される)

<authentication mode="Forms">
  <forms name="sample" timeout="1440" cookieless="UseCookies" slidingExpiration="true" />
</authentication>

さてブラウザ等はこの辺の処理を自動的にやってくれますが、アプリだと手動でやらないといけませんね。
ではEntityFrameworkではどうでしょう?

うーんそのまんまだとCookieどころかHTTPのレスポンスさえ見れませんね。
じゃぁどうしよう?と調べたところエンティティをQueryOperationResponseにキャストしてあげると良いみたいです。こんな感じ↓

ServiceReference1.Entities context = new ServiceReference1.Entities(new Uri("http://localhost/test.svc"));
context.MergeOption = MergeOption.NoTracking;
context.IgnoreMissingProperties = true;

var nodes = context.Users;

QueryOperationResponse<ServiceReference1.Users> response = nodes.Execute() as QueryOperationResponse<ServiceReference1.Users>;
if (response.Headers.Keys.Contains("Set-Cookie"))
{
    //response.Headers["Set-Cookie"] に新しいCookieが入ってる
}

foreach (var user in response)
{

	Console.WriteLine(user.DisplayName);
}

Cookieの有効期限が半分以上過ぎてからアクセスすると、レスポンスヘッダにちゃんとSet-Cookieが付与されているのがわかりますね。
あとはこの値をゴニョゴニョしておけばOKです。
※WCF Data Servicesで認証Cookie以外のCookieははかないと思いますが…一応注意ください。

これでForm認証するWCF Data Servicesとクライアントはばっちり?ですね!

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中