어리석은 질문처럼 보이지만 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
시간은 당신이받을과의 응답을 처리하기 위해 당신에게 클라이언트를주지 섬기는 사람.
“정상”메시지를주고받는 경우 둘 다 매우 짧을 수 있습니다. 특히 receiveTimeout
SOAP 메시지를 수신하고 해독, 확인 및 역 직렬화하는 데 거의 시간이 걸리지 않으므로. 스토리는 스트리밍과 다릅니다.이 경우 서버에서 다시받는 스트림의 “다운로드”를 실제로 완료하려면 클라이언트에서 더 많은 시간이 필요할 수 있습니다.
openTimeout, receiveTimeout 및 closeTimeout도 있습니다. 바인딩에 대한 MSDN 문서는 이것이 무엇을위한 것인지에 대한 자세한 정보를 제공합니다.
WCF의 모든 복잡한 내용을 이해하려면 Michele Leroux Bustamante 의 “Learn WCF “책 을 구입하는 것이 좋습니다 .
또한 그녀의 15 부작 ” WCF Top to Bottom “스크린 캐스트 시리즈 를 시청하는 데 시간을 할애 합니다. 적극 권장합니다!
고급 주제에 대해서는 Juwal Lowy의 Programming WCF Services 책 을 확인하는 것이 좋습니다 .
답변
가장 좋은 방법은 코드에서 원하는 설정을 변경하는 것입니다.
아래 예를 확인하십시오.
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
}