ServiceStack3.9.71を使用しています。Linuxにデプロイし、Monoを悩ませているメモリリークの問題を回避できるようにするために、セルフホストルートを使用します。
セルフホストサービスの問題は、リクエストがなくなったことです。それがなければ、セッションもありません。セッションを取得しようとすると失敗します
シングルトン経由でアクセス可能なASP.NETリクエストのみがサポートされています
nullリクエストオブジェクトが原因です。
質問は次のとおりです。
たとえば、サービスがリクエストを呼び出したユーザーの詳細(たとえば、ICustomAuthSessionにあるもの)を知る必要がある場合、どのようにそれを行いますか?キャッシュには実際にセッションが含まれていることがわかりますが、リクエストがないため、キャッシュからセッションを取得するために使用できるSessionKeyはありません。私はそれについていくらかの議論を見ますが、正確に何をすべきかを完全に理解することはできません。
セルフホストのServiceStackアプリケーションは、ServiceStackIISアプリケーションと同じ方法で要求とセッションにアクセスできます。
セルフホストアプリケーションはHttpListenerRequest
クラスを使用してHTTPリクエストを処理しますが、ServiceStackはこれを抽象化してIHttpRequest
、IISまたはセルフホストアプリケーション間でHTTPリクエストデータにアクセスするための一貫した方法を提供します。
ServiceStackサービスを使用しIHttpRequest
ているbase.Request
場合は、オブジェクトを介してにアクセスできます。のベースによって提供されるメソッドについては、ServiceBase.csを参照してください。Service
public class MyService : Service
{
// Your action method
public object Get(MyRequest request)
{
// Access to the request
var request = base.Request;
}
}
または、リクエストフィルター中にリクエストオブジェクトが提供されます。
this.RequestFilters.Add((httpReq, httpResp, requestDto) => {
// Access to the request through httpReq
});
IHttpRequest
ほとんどの場合、によって提供される抽象化がカバーするはずなので、元の基になるリクエストにアクセスする必要があることはめったにありません。ただし、たとえばリクエストクライアント証明書にアクセスしたい場合は、基になるリクエストからこれを取得できます。あなたはIHttpRequest.OriginalRequest
:をキャストすることによってこれを行うことができます
var originalRequest = IHttpRequest.OriginalRequest as HttpListenerRequest;
if(originalRequest != null)
{
// Example of accessing the client certificate
var certificate = originalRequest.GetClientCertificate();
}
セッションに正しくアクセスしていないようです。で使用されるServiceStackをSessionFeature
使用しているAuthenticationFeature
場合は、SessionIdを取得してからキャッシュクライアントから値を検索することを心配する必要はありません。ServiceStackには、セッションへのアクセスを処理するためのメソッドが組み込まれています。
独自のユーザーセッションメカニズムを提供するServiceStackの認証を使用しているかどうか、または標準のASP.NETキー値セッションストアに類似した単純なキー値ストレージを使用しているかどうかによって、セッションにアクセスする方法は異なります。あなたはできますここでのセッションについての詳細を学びます。
単純なキャッシュに裏打ちされたKeyValueストア(型なしセッションバッグ):
public class MyService : Service
{
public object Get(MyRequest request)
{
// Set
Session.Set<int>("Age",123);
// Retrieve
var age = Session.Get<int>("Age");
}
}
ServiceStackの認証機能によって提供されるセッションを使用するIAuthSession
。
public class MyService : Service
{
public object Get(MyRequest request)
{
// Provides access to the IAuthSession user session (if you are using the authentication feature)
var session = base.GetSession();
session.FirstName = "John";
}
}
ServiceStackの認証機能でカスタムセッションタイプを使用する(これはあなたがやろうとしていることのようです)。
public class MyService : Service
{
public object Get(MyRequest request)
{
var mySession = SessionAs<MySession>();
mySession.FirstName = "Clark";
mySession.LastName = "Kent";
mySession.SuperheroIdentity = "Superman";
}
}
public class MySession : AuthUserSession
{
public string SuperheroIdentity { get; set; }
}
これがお役に立てば幸いです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加