2009-06-05 2 views
4

기본 제공 Visual Studio 템플릿을 사용하여 WCF 응용 프로그램을 만들고 루프 중에 호출하려고하면 5 개의 요청 만 통과합니다. 그런 다음 서비스가 응답하지 않습니다. 이 문제를 해결할 수있는 유일한 방법은 각 호출 후에 연결을 닫는 것입니다.WCF에서 자동으로 연결을 닫을 수 있습니까?

나는 당신이 스스로 청소를해야한다는 것을 알고 있지만 웹 서비스에서도 이것을 할 필요가 없다는 것도 알고있다. 우리의 서비스에 타격을 가할 많은 사람들이 연결을 끊지 않을 것입니다.

WCF에서 동일한 동작을 수행 할 수있는 방법이 있습니까?

여기

<system.serviceModel> 
    <services> 
     <service name="WorkflowLibrary1.Workflow1" behaviorConfiguration="WorkflowLibrary1.Workflow1.Service1Behavior"> 
     <endpoint address="" binding="wsHttpContextBinding" contract="WcfServiceLibrary1.IService1"/> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
     <behavior name="WorkflowLibrary1.Workflow1.Service1Behavior"> 
      <serviceMetadata httpGetEnabled="true"/> 
      <serviceDebug includeExceptionDetailInFaults="true"/> 
     </serviceBehaviors> 
    </behaviors> 
    </system.serviceModel> 
+0

코드는 어디에 있습니까? 또한 WCF는 웹 서비스입니다. 이전 ASMX 기술을 언급 했습니까? _do_는 ASMX 프록시를 정리해야합니다. 그렇지 않으면 다른 방식으로 실패 할 수 있습니다. –

+0

나는 내 자신을 청소해야한다는 것을 알고 있지만,이 새로운 방법을 기반으로, 누군가가 우리의 서비스와 통합하고 제대로 연결을 닫지 않으면 기본적으로 우리 서버를 내릴 수 있습니다! –

답변

1

5 개 연결이 아마 서버에서 오는 내 설정 - 당신은 서버 serviceThrottling 행동에 의해 최대 열린 세션, 최대 동시 통화 및 최대 서버 인스턴스의 수를 정의 할 수 있습니다.

동시에, 이것은 동시에 열려있는 세션의 수를 늘릴 수있게 해줄 것입니다. 나는 옛날에 할 필요가 없다고하더라도, 여전히 자신을 깨끗하게 정리하는 것이 좋습니다. .

내가 지금처럼 using 문으로 클라이언트 프록시의 사용을 포장 제안 :

using(ClientProxy proxy = new ClientProxy()) 
{ 
    // go ahead, call your service methods 
} 

업데이트하십시오 commentor가 정당하게 지적으로,이 가지고 그것은 샤의 클라이언트는 폐기 될 때 예외를 던질 수 있기 때문에 문제의 따라서 실제로 제대로 작동하지 않을 수도 있습니다. 그렇지 않으면 클라이언트 프록시가 닫히는 문제를 처리하기 위해 try...catch을 감싸 야합니다.

Avoiding Problems with the Using Statement


그 방법은, 클라이언트 프록시가 자동으로 종료하고 클라이언트에서 서버로하여 사용하여 블록 끝의 범위, 그리고 채널이 해제 될 때의 배치 참조 서버 준비 다른 클라이언트로부터 다른 호출을 수신 할 수 있습니다.

또한 wsHttpContextBinding을 사용하여 기본적으로 켜져있는 세션이 필요한지 확인해야합니다. 예를 들어 서버에서 호출 단위 인스턴스화를 사용하는 것이 좋습니다. 각 호출자는 새 서버 오브젝트를 인스턴스화합니다. 세션은 완전히 새로운 문제와 잠재적 인 함정을 소개하므로, 실제로해야 할 때 (그리고 이로부터 혜택을 얻으려고 할 때)에만 사용하려고합니다. 그렇지 않으면 세션을 해제하십시오. 마크

+3

WCF가 손상되어 처분 할 수 있기 때문에 using 문에 프록시를 넣지 않을 것입니다. try/catch/finally /를 사용하고 마지막으로 try/catch를 사용하여 채널을 닫고 throw하면 중단합니다. –

+0

제가 더 자세한 내용을 추가 할 때, 그리고 만약 내가 서버에 가서 asp.net 응용 프로그램에 대한 perfmon 좀 봐, 나는 모든 연결을 사용하고 그들을 닫지 않아, 내가 볼 수 있습니다 단일 요청을 처리로 설정하고 더 이상 reuqests를 통해 얻을 수있는, 나는 서버가 resetiis 이외의 더 많은 요청을 수락 할 수있는 방법을 찾지 못했습니다. 저는 WCF가 서버를 클라이언트 측의 나쁜 관행에 대해 폭력적으로 만들 것이라고 믿기가 어렵습니다. 이것을 기반으로 한 클라이언트는 심지어 시도하지 않고 DOS 서버를 사용할 수 있습니다. –

+0

Kay : 이것은 사실 일 수 있습니다.하지만 연결된 5 개의 클라이언트가 있고 세션을 설정했는데 제대로 닫히지 않은 경우 서버를 열어 5 개의 세션을 갖게됩니다. 이는 서버 제한의 기본 제한입니다 . –

관련 문제