NULLリクエストが原因でセッションがない場合は、セルフホストされたServiceStackでどのようにコーディングするのが最適ですか?
-
21-12-2019 - |
質問
私はServiceStack 3.9.71を使用しています。私はLinux上で展開することができ、まだメモリリークの問題Pastuing Mono 。
自主サービスのあるものは、私たちはもはや要求を持っていません。それがなければ、私たちもセッションも持っていません。セッションを取得しようとする試みは
で失敗しますシングルトンを介してアクセス可能なASP.NET要求のみがサポートされています
NULL要求オブジェクトのためです。
質問は次のとおりです。
- 誰かが私たちが自己主催のServiceStackサービスで要求を持っていないのかを説明できますか?
- どうやってそれを回避するのですか?
例えば、サービスがリクエストを呼び出したユーザーの詳細を知っている必要がある場合は、どうやってやるのですか。キャッシュが実際にセッションが含まれていることがわかりますが、リクエストがありませんので、キャッシュからセッションをつかむために使用できるセッションキーはありません。いくつかのディスカッションがそれほどありませんが、かなりできません正確に何をすべきかを教えてください。
解決
Self-Hosted ServiceStackアプリケーションは、ServiceStack IISアプリケーションが実行するのと同じ方法でリクエストとセッションにアクセスできます。
要求にアクセスする
自己ホステッドアプリケーションは、HTTP要求を処理するためにHttpListenerRequest
クラスを使用しますが、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;
}
}
.
または要求オブジェクトは、要求フィルタを提供します。 A>:
this.RequestFilters.Add((httpReq, httpResp, requestDto) => {
// Access to the request through httpReq
});
.
var originalRequest = IHttpRequest.OriginalRequest as HttpListenerRequest;
if(originalRequest != null)
{
// Example of accessing the client certificate
var certificate = originalRequest.GetClientCertificate();
}
.
セッションへのアクセス
あなたがセッションに正しくアクセスされていないように聞こえます。 SessionFeature
によって使用されているServiceStackのAuthenticationFeature
を使用している場合は、SessionIDの取得を心配してからキャッシュクライアントからの値を検索することを心配する必要はありません.ServicSetackは、セッションのアクセスを処理するためのメソッドを構築しました。
それ自身のユーザセッションメカニズムを提供するServiceStackの認証を使用しているかどうか、あるいは標準のASP.NETキー値セッションストアに類似した単純なキー値格納を使用しているかによって、セッションにアクセスする方法があります。 ここでのセッションについての詳細
Simple Cache Backed キーバリューストア(未定型セッションバッグ):
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; }
}
.