2012-12-06 3 views
8

나는 WCF 서비스는 SOAP를 사용하여 AJAX 클라이언트에 의해 소비가 1.2wsHttpBinding을 사용할 때 InstanceContextMode.PerSession이 PerCall처럼 작동하는 이유는 무엇입니까?

의 Web.config :

<endpoint address="" binding="wsHttpBinding" 
contract="WcfService1.IService1" bindingConfiguration="wsHttpBin"> 

<wsHttpBinding> 
    <binding name="wsHttpBin"> 
    <security mode="None"/>   
    </binding> 
</wsHttpBinding> 

에서 내가 read이 무엇인지, 나는 "있는 wsHttpBinding"바인딩에 노출 된 서비스 이후 <security mode="None"/>을 사용해야합니다 WS- * 웹 서비스 사양 제품군의 WS-Security를 ​​구현합니다. 바인딩은 보안을 사용하므로 AJAX는 보안 컨텍스트를 지원하지 않으므로 요청이 거부됩니다.

내 WCF 서비스 동작은 InstanceContextMode.PerSession로 정의됩니다

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
       InstanceContextMode = InstanceContextMode.PerSession)] 

하지만 난 그것을 소비 할 때, PerCall 모든 전화와 같은 서비스 동작합니다 대신 현재 인스턴스를 사용하는 새로운 WCF 인스턴스를 시작합니다.

wsHttpBinding을 사용할 때 InstanceContextMode.PerSession이 PerCall처럼 작동하는 이유는 무엇입니까?

어떻게해야합니까?

+0

가능한 복제본 : http://stackoverflow.com/questions/4767102/wcf-sessions-with-a-wshttpbinding-and-without-windows-security – ErnieL

+0

@ErnieL 감사하지만 내 AJAX 클라이언트에서는 작동하지 않으므로 옵션이 아닙니다. –

+0

그 자체로 wsHttpBinding은 세션을 지원하지 않습니다. – ErnieL

답변

3

세션은 HTTP를 통해 사용될 때 보안 세션이나 안정적인 세션을 사용할 때 WCF에서만 지원됩니다. 둘 중 하나를 사용할 수 없다면 스스로 세션 메커니즘을 구현해야합니다. 클라이언트와 서버 측 모두를 제어한다면, 매우 쉽습니다. 방법은 다음과 같습니다.

저장할 세션 데이터 (예 : SessionData)를 저장하는 클래스를 만들고 세션을 마지막으로 사용할 때 추가로 DateTime을 추가합니다. 그런 다음 서비스 클래스 (또는 다른 클래스)에 staticConcurrentDictionary<string, SessionData>을 추가하십시오.

클라이언트가 서비스를 호출 할 때 세션을 식별하는 고유 한 문자열을 전달해야합니다 (클라이언트 측에서 임의로 생성 될 수 있음). 클라이언트가 서비스를 호출 할 때마다 사전에서 세션 문자열을 찾아보고 세션 데이터를 검색하고 필요에 따라 해당 내용을 업데이트하십시오. 존재하지 않으면 사전에 새 항목을 작성하십시오. 또한 SessionData 개체에 액세스 할 때마다 '최근에 사용한'DateTime을 현재 시간으로 업데이트하십시오. 백그라운드 작업은 잠시 동안 사용되지 않은 이전 세션을 주기적으로 지워야합니다.

이제 세션을 구현했습니다. 이제 InstanceContextMode.Single을 사용할 수 있으며 세션 당 서비스 클래스의 인스턴스를 올바르게 작성하는 WCF에 대해 걱정하지 않아도됩니다.

편집 : 당신이 .NET 4.5으로 WCF 서비스를 작성할하고 웹 응용 프로그램은 최신 브라우저를 대상으로하는 경우에는 서버 측에서 NetHttpBinding를 사용하고 웹 소켓 클라이언트 측에서 할 수 있습니다. NetHttpBinding은 세션을 지원합니다 (SessionMode.Required을 지정하는 경우).

+0

+1 : 귀하의 제안이 처음부터 잘못되었다는 말은하지 않지만, 프로덕션 준비 세션 메커니즘을 구현하기 위해서는 고려해야 할 문제가 있습니다. 즉, 세션 도용 (우발적 또는 목적 상), 실제 세션 시간 초과 세션 (데이터) 지속성/복원력, 서버 재시작 (예정 또는 계획되지 않음/충돌), 여러 동시 요청으로 세션 (데이터)의 동시 수정 –

+0

@ Christian.K : Very 참된. 나는 마지막 두 가지가 WCF에 의해 전혀 제공되지 않는다고 생각합니다. 보안은 실제로 고려해야 할 쟁점이며, 스레드 안전성에 관해서는 각 클라이언트가 고유 한 세션 키를 생성하고 주어진 시간에 최대 하나의 호출을 수행 할 것이라고 가정했지만, 스레드 안전성 및 정확성 또한 처리해야합니다. –

+0

@AllonGuralnek이 InstanceContextMode를 사용하지 않습니다 .Single이 내 성능에 큰 영향을 미칩니 까? –

0

link은 (물론 일반적으로) 이것에 대해 알아야 할 모든 것을 제공합니다.

하지만 정확합니다.

그들은 명시 적으로 호출 응용 프로그램

내가 당신을 저장할 수 있도록하는 어떤 JS 코드/프레임 워크에 대해 모르는 말을해야에 의해 시작 및 종료됩니다 : MSDN은 WCF 세션에 대해 말한다 명시 적으로 WCF 통신 채널을 열어 "세션"을 유지합니다. (당신은 클라이언트 코드를 제공하지 않으므로 일부 가정을해야합니다.) WCF 세션이 "쿠키 기반"이 아닙니다. ASP.NET 웹 응용 프로그램처럼 브라우저에서 "즉시"작동하지 않습니다.

설정 InstanceContextMode.PerSession은 WCF 서비스를 "세션 준비 상태"로 설정하지만 세션을 "강제 수행"하는 것으로 충분하지 않습니다.

+0

ASP.NET에서 "쿠키 기반"이란 무엇입니까? 를 추가하면 사용할 수 있습니까? 나는 "즉시"해결책을 가질 수 있는가? –