nullリクエストのためにセッションを行うことができない場合、セルフホストのServiceStackでコーディングするのに最適な方法は何ですか?

ボヤン

ServiceStack3.9.71を使用しています。Linuxにデプロイし、Monoを悩ませているメモリリークの問題を回避できるようにするために、セルフホストルートを使用します

セルフホストサービスの問題は、リクエストがなくなったことです。それがなければ、セッションもありません。セッションを取得しようとすると失敗します

シングルトン経由でアクセス可能なASP.NETリクエストのみがサポートされています

nullリクエストオブジェクトが原因です。

質問は次のとおりです。

  1. セルフホストのServiceStackサービスでリクエストを受け取れない理由を誰かが説明できますか?
  2. どうすればそれを回避できますか?

たとえば、サービスがリクエストを呼び出したユーザーの詳細(たとえば、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]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ