null 요청으로 인해 세션을 가질 수 없는 경우 자체 호스팅 ServiceStack에서 코딩하는 가장 좋은 방법은 무엇입니까?

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

  •  21-12-2019
  •  | 
  •  

문제

ServiceStack 3.9.71을 사용하고 있습니다.Linux에 배포하면서도 다음과 같은 문제를 피할 수 있도록 자체 호스팅 경로를 사용하겠습니다. Mono를 괴롭히는 메모리 누수 문제.

자체 호스팅 서비스의 문제는 더 이상 요청이 없다는 것입니다.그것이 없으면 세션도 없습니다.세션을 가져오려는 시도는 실패합니다.

싱글톤을 통해 액세스할 수 있는 ASP.NET 요청만 지원됩니다.

null 요청 개체로 인해.

질문은 다음과 같습니다:

  1. 자체 호스팅 ServiceStack 서비스에서 요청을 받을 수 없는 이유를 누군가 설명할 수 있습니까?
  2. 어떻게 해결할 수 있나요?

예를 들어 서비스가 요청을 호출한 사용자의 세부 정보(예: ICustomAuthSession에 있는 내용)를 알아야 하는 경우 어떻게 해야 합니까?캐시에 실제로 세션이 포함되어 있다는 것을 알 수 있지만 요청이 없으므로 캐시에서 세션을 가져오는 데 사용할 수 있는 SessionKey가 없습니다.좀 좀 보이네 논의 하지만 정확히 무엇을 해야 할지 알 수 없습니다.

도움이 되었습니까?

해결책

자체 호스팅 ServiceStack 응용 프로그램은 ServiceStack IIS 응용 프로그램과 동일한 방식으로 요청 및 세션에 액세스할 수 있습니다.

요청에 액세스하기

자체 호스팅 애플리케이션은 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 키 값 세션 저장소와 유사한 단순 키 값 저장소를 사용하는지 여부에 따라 세션에 액세스하는 방법은 다양합니다.당신은 할 수 있습니다 여기에서 세션에 대해 자세히 알아보세요..

간단한 캐시 지원 핵심 가치 저장소 (유형이 지정되지 않은 세션 백):

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