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

어리석은 질문처럼 보이지만 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>



답변

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

<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


답변

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

아래 예를 확인하십시오.

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


답변

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


답변

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

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

또는

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


답변