WCF 서비스, 시간 제한을 늘리는 방법은 무엇입니까?


93

어리석은 질문처럼 보이지만 WCF의 모든 것이 asmx보다 훨씬 복잡해 보입니다. svc 서비스의 시간 초과를 어떻게 늘릴 수 있습니까?

지금까지 내가 가지고있는 것은 다음과 같습니다.

<bindings>
      <basicHttpBinding>
        <binding name="IncreasedTimeout" 
          openTimeout="12:00:00" 
          receiveTimeout="12:00:00" closeTimeout="12:00:00"
          sendTimeout="12:00:00">
        </binding>
      </basicHttpBinding>
</bindings>

그리고 내 끝점은 다음과 같이 매핑됩니다.

<endpoint address="" 
  binding="basicHttpBinding" bindingConfiguration="IncreasedTimeout"
             contract="ServiceLibrary.IDownloads">
             <identity>
                <dns value="localhost" />
             </identity>
          </endpoint>

내가 받고있는 정확한 오류 :

00 : 00 : 59.9990000 이후 응답을 기다리는 동안 요청 채널이 시간 초과되었습니다. Request 호출에 전달 된 제한 시간 값을 늘리거나 바인딩에서 SendTimeout 값을 늘리십시오. 이 작업에 할당 된 시간이 더 긴 시간 제한의 일부일 수 있습니다.

WCF 테스트 클라이언트에는 내 서비스의 런타임 구성이 포함 된 구성 아이콘이 있습니다.

보시다시피 내가 설정 한 값과 동일하지 않습니까? 내가 뭘 잘못하고 있죠?

<bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IDownloads" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="">
                            <extendedProtectionPolicy policyEnforcement="Never" />
                        </transport>
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>

답변:


179

바인딩 구성에는 조정할 수있는 네 가지 시간 제한 값이 있습니다.

<bindings>
  <basicHttpBinding>
    <binding name="IncreasedTimeout"
             sendTimeout="00:25:00">
    </binding>
  </basicHttpBinding>

가장 중요한 것은 sendTimeout클라이언트가 WCF 서비스의 응답을 기다리는 시간을 나타내는입니다. hours:minutes:seconds설정에서 지정할 수 있습니다. 샘플에서는 시간 제한을 25 분으로 설정했습니다.

openTimeout당신이 당신의 WCF 서비스에 대한 연결을 열 때 기다릴 기꺼이 시간은 이름에서 알 수 있듯이. 마찬가지로, closeTimeout연결을 닫을 때 (클라이언트 프록시 삭제) 예외가 발생하기 전에 기다리는 시간입니다.

receiveTimeout인을위한 거울 같은 비트 sendTimeout- 송신 시간 제한은 서버의 응답을 기다리는거야 시간이있는 동안,이 receiveTimeout시간은 당신이받을과의 응답을 처리하기 위해 당신에게 클라이언트를주지 섬기는 사람.

"정상"메시지를주고받는 경우 둘 다 매우 짧을 수 있습니다. 특히 receiveTimeoutSOAP 메시지를 수신하고 해독, 확인 및 역 직렬화하는 데 거의 시간이 걸리지 않으므로. 스토리는 스트리밍과 다릅니다.이 경우 서버에서 다시받는 스트림의 "다운로드"를 실제로 완료하려면 클라이언트에서 더 많은 시간이 필요할 수 있습니다.

openTimeout, receiveTimeout 및 closeTimeout도 있습니다. 바인딩에 대한 MSDN 문서는 이것이 무엇을위한 것인지에 대한 자세한 정보를 제공합니다.

WCF의 모든 복잡한 내용을 이해하려면 Michele Leroux Bustamante 의 "Learn WCF "책 을 구입하는 것이 좋습니다 .

WCF 학습 http://ecx.images-amazon.com/images/I/51GNuqUJq%2BL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg

또한 그녀의 15 부작 " WCF Top to Bottom "스크린 캐스트 시리즈 시청하는 데 시간을 할애 합니다. 적극 권장합니다!

고급 주제에 대해서는 Juwal Lowy의 Programming WCF Services 책 을 확인하는 것이 좋습니다 .

프로그래밍 WCF http://ecx.images-amazon.com/images/I/41odWcLoGAL._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg


web.config의 <system.serviceModel>에 바인딩 섹션을 추가하려고했지만 지금 오류가 발생합니다 .... 내가 놓친 추가 단계 ...
JL.

또한 내 서비스의 엔드 포인트를 <endpoint address = ""binding = "IncreasedTimeout"으로 변경했습니다. 이것이 잘못된 일입니까?
JL.

나는 그것을 얻는 것 같아요-binding = "basicHttpBinding"bindingConfiguration = "IncreasedTimeout"
JL.

정확히-바인딩은 사용하는 프로토콜 유형 (basicHttp, wsHttp, netTcp)입니다. 바인딩 구성 은 시간 초과 등을 수정하기 위해 구성에서 만드는이 구성입니다.
marc_s

이 작업을 한 후에도 여전히 시간 초과 오류가 발생합니다. Marc는 가능한 한 많은 정보를 제공해 주시겠습니까?
JL.

27

가장 좋은 방법은 코드에서 원하는 설정을 변경하는 것입니다.

아래 예를 확인하십시오.

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    client.Endpoint.Binding.SendTimeout = new TimeSpan(0, 1, 30);
}

이것은 구성을 업데이트하는 것보다 더 나은 솔루션이므로 다른 통화 및 서비스에 대해 다른 값을 구성 할 수 있습니다. 감사합니다
Salim

26

제한 시간 구성은 클라이언트 수준에서 설정해야하므로 web.config에서 설정 한 구성은 효과가 없었고 WCF 테스트 도구에는 자체 구성이 있으며 제한 시간을 설정해야하는 곳이 있습니다.


1
예, 일반적으로 클라이언트와 서버 모두에서 설정해야합니다. 예를 들어 세션에서 "inactivityTimeout"과 같은 경우에도 마찬가지입니다.
marc_s

8
JL : 당신이 한 일을 보여줄 수 있습니까? 같은 문제가 있습니다
Nick Kahn

'WCF 테스트 클라이언트'를 사용하는 경우 서비스 트리에서 '구성 파일'을 마우스 오른쪽 버튼으로 클릭 한 다음 'SvcConfigEditor로 편집'을 클릭하고 바인딩 내에서 시간 제한을 변경합니다.
Radderz

4

최근에 동일한 오류가 발생했지만 모든 wcf 클라이언트 호출을 닫도록 확인하여 수정할 수있었습니다. 예.

WCFServiceClient client = new WCFServiceClient ();
//More codes here
// Always close the client.
client.Close();

또는

using(WCFServiceClient client = new WCFServiceClient ())
{ 
    //More codes here 
}

10
다음 '사용'접근 사용하지 마십시오 omaralzabir.com/do-not-use-using-in-wcf-client
알렉스 마샬

omaralzabir.com/do-not-use-using-in-wcf-client 의 의견에 using오류가있는 채널 개체를 삭제하지 않고 계속 사용 하는 방법에 대한 예제가 있습니다. 다음은 using블록 과 더 호환되는 접근 방식을 가진 또 다른 블로거입니다 : erwyn.bloggingabout.net/2006/12/09/WCF-Service-Proxy-Helper .
그렉
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.