NULLリクエストが原因でセッションがない場合は、セルフホストされたServiceStackでどのようにコーディングするのが最適ですか?

StackOverflow https://stackoverflow.com//questions/25049848

  •  21-12-2019
  •  | 
  •  

質問

私はServiceStack 3.9.71を使用しています。私はLinux上で展開することができ、まだメモリリークの問題Pastuing Mono

自主サービスのあるものは、私たちはもはや要求を持っていません。それがなければ、私たちもセッションも持っていません。セッションを取得しようとする試みは

で失敗します

シングルトンを介してアクセス可能なASP.NET要求のみがサポートされています

NULL要求オブジェクトのためです。

質問は次のとおりです。

  1. 誰かが私たちが自己主催のServiceStackサービスで要求を持っていないのかを説明できますか?
  2. どうやってそれを回避するのですか?
  3. 例えば、サービスがリクエストを呼び出したユーザーの詳細を知っている必要がある場合は、どうやってやるのですか。キャッシュが実際にセッションが含まれていることがわかりますが、リクエストがありませんので、キャッシュからセッションをつかむために使用できるセッションキーはありません。いくつかのディスカッションがそれほどありませんが、かなりできません正確に何をすべきかを教えてください。

役に立ちましたか?

解決

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 

});
.

IHttpRequestによって提供される抽象化がほとんどの場合あなたをカバーする必要があるため、元の基礎となる要求にアクセスする必要があることは稀です。たとえば、必要な場合は、たとえば要求クライアント証明書にアクセスするために、基礎となる要求からこれを取得できます。 IHttpRequest.OriginalRequestをキャストすることでこれを行うことができます。

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; }
}
.

これが助けを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top