문제

WSHTTPBinding을 사용하여 HTTP를 통신하는 WCF 클라이언트/서버 앱이 있습니다.

서버 설정: 표준 WCF를 사용하는 자조 주최 ServiceHost. 내 실제 서비스 클래스는 다음과 같습니다.

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

클라이언트 설정: Visual-Studio 생성 클라이언트 프록시 사용 사용 동기 서비스 통화 (proxy.call_server_method 서버가 전체적으로 응답 할 때까지 차단됩니다.)

대본: 서버에서 실행하는 데 20 초가 걸리는 특정 메소드 호출이 하나 있습니다. 클라이언트는이 메소드를 별도의 스레드로 호출하므로 유지되지 않습니다. ConcurrencyMode.Multiple 의미 WCF가 서버의 별도 스레드에서도 실행해야합니다.

이 이론은 앱을 사용하도록 구성 할 때 NetTcpBinding, 모든 것이 잘 작동합니다.

문제:
사용할 앱을 구성하는 경우 WSHttpBinding,이 긴 메소드 호출은 HTTP 요청이 '백업'을 유발합니다. 내 로그 검사와 Fiddler를 사용하여 HTTP 요청을 디버깅 하여이 동작을 확인했습니다.

예시:

  • 클라이언트는 백그라운드 스레드에서 20 초 긴 요청을 시작합니다
  • 클라이언트는 전경 스레드에서 요청 B 및 C를 시작합니다
  • 요청 B와 C는 서버로 전송되며 20 초 긴 요청으로 처리 될 때까지 처리하지 않습니다.

하지만 가끔은:

  • B와 C를 요청합니다 보내지 마십시오 (피들러에도 나타나지 않음) 20 초 요청이 돌아올 때까지 (이것은 드물다).
    • 참고 : 설정 <add address="*" maxconnection="100"/> 클라이언트의 app.config 에서이 일이 중단되었습니다.
  • 요청 B가 발송되고 즉시 응답을 받고, 요청 C는 20 초가 완료 될 때까지 보류됩니다 (드문 경우).

다음은 문제를 보여주는 Fiddler의 타임 라인입니다. (더 큰 버전을 클릭하십시오)

보시다시피, 요청은 모두 서버에서 백업됩니다. 20 초 요청이 완료되면 응답이 모두 홍수가 발생하지만 몇 가지 요청이 있습니다. 그렇지 않습니다 일어나고 ...

그래서, 질문:

  • 도대체 여기서 무슨 일이 일어나고 있습니까? 왜 잘 작동합니까? NetTcpBinding 그리고 사용하지 않습니다 WSHttpBinding?
  • 일관되지 않은 행동 인 이유는 무엇입니까?
  • 수정하려면 어떻게해야합니까?

메모:

  • 서버에서 고정되지 않습니다. 중단 점을 설정하고 사용했습니다 !syncblk 그리고 그것은 일관되게 자물쇠가 보유되지 않는다고보고합니다.
  • 그것은 내 스레딩이 아닙니다 (nettcpbinding은 달리 작동하지 않아야합니다)
  • 나는 가지고있다 <serviceThrottling maxConcurrentCalls="1000" maxConcurrentInstances="1000" maxConcurrentSessions="1000" /> 서버의 app.config에서 설정합니다
  • 20 초의 호출은 타이머를 기다리는 것입니다. CPU 또는 디스크 또는 네트워크를 스래싱하지 않습니다.
  • 나는 비동기 통화를 사용하기 위해 응용 프로그램을 다시 설정하지 않는 솔루션을 선호합니다 ... 그것은 많은 레거시 코드이며, 내가 이해하지 못하는 것들을 엉망으로 만들고 싶지 않습니다.
도움이 되었습니까?

해결책 3

우리의 최종 솔루션이 무엇인지 다른 사용자를 보여주기위한 자기 답변

결국, 나는 이것을 해결하지 못했습니다.
우리의 최종 솔루션은 앱을 멀리하는 것입니다. WSHttpBinding 그리고 NetTcpBinding 생산에서 - 우리는 어쨌든 성능의 이유로 결국 이것을 할 계획이었습니다.

그래도 검은 자국을 남기기 때문에 이것은 불행한 일입니다. WSHttpBinding 보증되거나 보증되지 않을 수 있습니다. 누군가가 도랑과 관련이없는 솔루션을 생각해 낸 경우 WSHttpBinding, 나는 그것에 대해 알고 싶습니다

다른 팁

WCF (.NET 또는 Windows Thing) 외부의 스로틀이 기본적으로 최대 2 개의 동시 아웃 바운드 HTTP 연결 만 허용하는 데 기본적으로 스로틀이 있습니다. 불행히도 나는 내 인생의 이름을 기억할 수 없다 (그리고 당신이 app.config 또는 앱을 무시하기 위해 당신이 무엇을 넣었는지). 요청이 클라이언트를 떠나는 것을 보지 못하고 HTTP 일뿐 아니라 "그 일"을 치고 있다고 생각합니다. 나는 그 이름을 계속 찾고있을 것입니다.

업데이트 : 찾았습니다 - 클라이언트에서 시도해보십시오 (그러나 '2'를 더 큰 숫자로 변경) :

<configuration>
  <system.net>
    <connectionManagement>
      <add address = "*" maxconnection = "2" />
    </connectionManagement>
  </system.net>
</configuration>

우리는 IIS/ASP.NET에서 호스팅 된 JSON 서비스에서 정확히 동일한 증상을 보았습니다.

근본 원인은 결국 WCF가 아닌 요청을 동기화하는 asp.net이되었습니다. 동시 WCF 방법을 얻기 위해 세션 상태 (신청 수준)를 비활성화해야했습니다.

web.config :<system.web> <sessionState mode="Off" /> </system.web>

당사의 서비스는 wshttpbinding이 아닌 webhttpbinding을 사용합니다. 따라서 이것이 오리온의 문제를 해결하는지 확실하지 않습니다.

프로토콜 한도를 누르고 있는데이를 해결하려면 클라이언트 시스템의 표준 설정을 수정해야합니다.

http://support.microsoft.com/kb/183110

http://support.microsoft.com/kb/282402

wshttpbinding은 요청을 발행 할 때 Wininet 설정을 사용한다고 생각합니다.

Basichttpbinding으로 변경하면 작동합니까?

그렇습니다 이것이 당신의 문제입니다, 세션 스로틀 링, 엉덩이에 나를 물었다.

동시 당 서비스에 동시 모드를 사용하여 동시 통화를 허용하는 것을 고려하십시오.

나는 잊어 버린다 - 주문할 수 있을까요? HTTP에 대한 RM은 주문을 보존하지만 TCP 세션은 어쩌면 (명시 적으로 요청하지 않는 한) TCP 세션이 아닐까요? 서비스 계약에 주문/변절되지 않은 세션을 설명한 속성이 있습니까 (잊어 버렸습니다).

확실하지 않지만 때로는 Silverlight 애플리케이션의 동시 호출 문제는 브라우저 연결 관리와 관련이 있습니다. 저에게 솔루션은이를 app.xaml.cs, application_startup 메소드에 여기에 두는 것이 었습니다. http://weblogs.asp.net/olakarlsson/simultly-calling-multiple-methods-on-a-wcf-service-from-silverlight

WebRequest.RegisterPrefix("http://", WebRequestCreator.ClientHttp);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top