2014-12-18 9 views
9

OWIN 프로세스에서 호스팅되는 샘플 웹 API가 있습니다 (IIS가 아닌 자체 호스팅). 내 컨트롤러에서 JWT 토큰을 얻었고 응용 프로그램의 다른 부분 인 NserviceBus IMutateOutgoingTransportMessages를 구현하는 클래스에서이를 검색 할 수 있기를 원합니다. 내 다른 웹 응용 프로그램 POC (IIS에서 호스팅되는)에서 간단한 세션 변수를 사용하고 잘 작동합니다. 그러나 새로운 OWIN 자체 호스팅 환경에서 가장 좋은 방법은 무엇이 있는지 알고 싶습니다. 정적 클래스의 정적 속성?OWIN 자체 호스트에서 동일한 세션 변수

+0

저는 현재 동일한 정보 (Owin 자체 세션에서 정보를 저장하는 세션)에 직면하고 있습니다. – fra

답변

1

이 질문은 귀하의 구체적인 요구 사항에 대한 상세한 지식이 없으면 대답하기가 정말로 광범위하고 어렵습니다.

  • 이미 아마도 브라우저 sessionStorage (또는 로컬 스토리지)에있는 토큰을 저장하는 각 요청에 서명하고,하지만 당신은 외부 토큰을 검색해야
  • 충분하지 않습니다 여기에 문제의 나의 해석이다
  • 응용 프로그램에 상태가 될 필요가 없습니다 또는되지 않은 요청주기와 관련하여 (없는 경우에 당신이 답을 찾고해야하는 위치, 이것은 아마도)

A의 한 토큰 그냥 하나 개의 정적 특성 정적 클래스는 물론 s을 깨기 시작합니다. 두 개 이상의 요청이 동시에 응용 프로그램에 도달하면 각 토큰을 식별하기 위해 어떤 키를 사용해야하는지는 알 수 없지만 토큰 목록을 유지하는 클래스를 구현하는 것이 해결책 일 수 있습니다. 토큰을 두 번 이상 검색해야하는 경우와 같이 인터페이스 세부 정보가 달라질 수 있습니다.

스레드 안전 문제는 그러한 클래스의 모든 처리 및 구현에 적용됩니다. 영감으로 기능 프로그래밍 연습 인 Immutable Collections을 사용하면 도움이 될 수 있습니다.

느린 토큰이 문제가된다면 (그리고 보안적인 측면에서 볼 때 다른 것이 없다면) 토큰이 어떤 이유로 든 환영보다 오래 머물지 않도록하는 방법을 찾아야합니다 완료되지 않았습니다.

Session을 POC의 솔루션으로 사용한 방법을 보면 비슷한 동작이 필요한 것으로 가정하고 한 명의 사용자가 동시에 두 개의 토큰을 전달할 수 없어야합니다. 토큰을 데이터베이스 나 로컬 파일 시스템에 저장할 수 있으므로 유지 관리와 유효성을 모두 별도의 문제로 만듭니다.

OWIN 자체 호스팅 응용 프로그램에 이미 사용할 수있는 캐시와 유사한 기능이 구현되어 있으며, 그 중 하나가 모든 것을 직접 구현하는 지름길 역할을 할 수도 있습니다.

사실이 토큰 비즈니스가 응용 프로그램에서 상태를 소개하는 유일한 이유 인 경우 가장 좋은 해결책은 응용 프로그램이 상태를 유지할 수 없도록 아키텍처를 다시 생각하는 것입니다.

+0

사실, 테스트 일 뿐이므로 자체 호스팅 옵션을 삭제했습니다. OWIN의 기능과 같은 캐시에서 나를 지적 해 주셔서 감사합니다. 우리는 여전히 이것을 수행하는 올바른 방법을 평가하고 있으며, 가능하다면 무국적 상태를 유지하는 애플리케이션 요구 사항에 대해 절대적으로 옳습니다. –

0

저는 현재 고객을 위해 개발중인 서버에서 비슷한 딜레마에 직면하고 있습니다. 내 문제는 서버가 레거시, 멀티 스레드 DLL (일명 SDK)을 호출하고 라이브 연결을 유지해야한다는 것입니다.

일반 웹 API 프로젝트를 사용하여 IIS에서이 작업을 수행하는 데 어려움을 겪었습니다. 스레드가 악의적 인 것으로 판단되면 IIS가 스레드를 재활용하기 때문에 실패했습니다. 마녀는 SDK 스레드가 그 관점에서 보이는 것입니다. 또한 SDK는 호출자 (클라이언트 - 단일 페이지 앱)에서 콜백 할 수 있어야하며이 경우 SignalR을 사용하고 있습니다.

그런 다음 다중 파트 시스템 (SDK 통합을 위해 IIS + WCF 서비스에서 단일 페이지 + 웹 API)을 시도했습니다.그러나 모든 앱 사이에서 발생해야하는 2 가지 비동기 통신으로 인해 관리하기가 정말 어렵습니다. 다시 : 실패.

그래서 콘솔 앱 (지금은)에서 하나의 자체 호스팅 OWIN + WebAPI 서비스로 되돌아갔습니다. 내 문제는 일부 호출이 길고 작업자 스레드에서 처리된다는 것입니다. 헤더를 통해 각 Ajax 호출에서 SignalR 클라이언트 ID를 전달할 수있었습니다. 나는 웹 api 컨트롤러에서 ID를 추출 할 수 있습니다. 그러나 작업이 비동기가되면 비동기 작업을 관리하는 클래스에서 ID를 가져와야합니다 (Unity가 주입 한 서비스를 통해). 여기 내 문제는 너의 것과 비슷하다. IIS에서 호스팅되는 응용 프로그램에는 HttpContext가 있습니다. 그것은 각 클라이언트 호출에 contextualized이며, 파이프 라인의 모든 스레드 변경 사항을 따릅니다 ...하지만 자체 호스팅 OWIN WCF 애플 리케이션에서 ...

스레드 로컬 저장소, CallContext ... 및 다른 방법을 찾고 있어요 비동기 호출의 수명주기 동안 원래 발신자 정보를 추적 할 수 있습니다. OWIN 파이프 라인에 대해 읽었습니다. OWIN 미들웨어에서 정보를 캡처 할 수는 있지만 ... 주입 된 서비스에 사용하기 위해 정보를 안전하게 보관하는 방법은 무엇입니까? 나는 여전히 답을 찾고 있습니다 ...

이 흥미로운 문제에 대한 해결책을 찾았습니까?

다른 병렬 스레드/SO 질문을 시작하는 대신 스레드에 추가하는 것을 선호합니다.

+0

불행히도 없습니다. 우리는 IIS가 자체 호스팅 대신 OWIN을 호스팅하기로 결정했습니다. 하지만 System.Runtime.Caching을 살펴 보시기 바랍니다. –