2011-04-27 3 views
2

후 절전 모드로 전환 응용 프로그램을 구축 중이므로 우수한 ASIHTTPRequest 라이브러리를 사용하여 요청하고 있습니다.WCF REST 서비스는 내가 정기적으로 ASP.NET 웹 프로젝트에 선언 된 WCF REST 서비스를 가지고 활동

서비스 자체는 정상적으로 작동하지만 약 10 분 동안 유휴 상태가되면 서비스가 잠자기 상태가되어 결국에는 iPhone에서 시간 초과 문제가 발생합니다.

브라우저를 통해 서비스를 요청하면 서비스가 동일하지만 30 초 정도 지나면 서비스가 "깨어나 다"고 표시되고 모든 연속 요청이 실제로 빠릅니다. iPhone에서 타임 아웃 한도를 높일 수는 있지만 핸드 헬드 장치에서는 그다지 잘 작동하지 않는 것 같습니다.

구성 문제라고 생각합니다. 이 서비스는 IIS 7.5가 설치된 Win2008R2에서 호스팅됩니다.

IIS 웹 사이트는 Integrated Pipeline과 함께 .NET Framework v4를 실행하는 자체 AppPool로 구성됩니다.

누구나 해결 방법이 있습니까?

+0

가장 큰 원인은 IIS의 응용 프로그램 풀 재활용 일 수 있습니다. IIS 용 AppPool 재활용 설정 확인 http://www.iis.net/ConfigReference/system.applicationHost/applicationPools/add/recycling – Chandermani

답변

3

서비스를 호스팅하는 응용 프로그램 풀은 유휴 시간 제한 속성 (IIS 관리 콘솔의 응용 프로그램 풀의 고급 설정)을 기본값 인 20 분으로 정의합니다. 유휴 시간 제한 내에 응용 프로그램 풀에서 요청을받지 못하면 풀을 제공하는 작업자 프로세스가 종료됩니다. 새 요청을받은 후 IIS는 프로세스를 다시 시작해야하며 프로세스는 응용 프로그램 도메인 및 모든 관련 어셈블리를로드하고 .svc 파일을 컴파일하고 서비스 호스트를 실행하고 요청을 처리해야합니다.

해결 방법은 유휴 시간 제한을 늘릴 수 있지만이 시간 제한은 서버 리소스를 올바르게 처리한다는 의미입니다. 프로세스가 필요하지 않은 경우 프로세스를 중지해야합니다. 또 다른 추악한 해결 방법은 정기적으로 같은 응용 프로그램에서 서비스 또는 페이지의 일부 메서드를 호출하는 일부 ping 프로세스 (예 : cron 작업 또는 서버의 예약 된 작업)를 사용하는 것입니다.

편집 :이 답변은 "AlwaysRunning"옵션을 사용할 수없는 이전 IIS 버전 용으로 작성되었습니다. 다른 답변을 확인하십시오.

+0

감사합니다. 나는 이것이 대답이었던 것 같았습니다. :) 당분간 나는 그것을 유지하기 위해 서비스를 ping 할 것입니다. –

+0

"솔루션을 사용하면 유휴 시간이 길어질 수 있지만이 제한 시간의 의미는 서버 리소스를 올바르게 처리 한 것이므로 프로세스가 필요하지 않으면 중지해야합니다." 나는 그것을 받아 들일 수 없다. 내 서비스를로드하는 데 10 분이 걸리면 어떻게됩니까? 공연에 대한 법적 의무가 있다면 어떻게해야합니까? 캐시 된 데이터는 어떻습니까? 추악한 것은 해결 방법이 아니며 프로그래머 \ sysadmin이 자신의 특정 시나리오에 가장 적합한 솔루션을 모르는 접근 방식입니다. –

4

IIS 7.5를 사용하고 있기 때문에 웹 응용 프로그램에서 응용 프로그램 자동 시작 기능을 활성화 할 수 있으므로 서비스가 "활성"상태로 유지됩니다.

--larsw

+0

Lars 감사합니다. 나는 이것을 조사 할 것이다. –

7

이, 당신은 어떻게 자동 시작을 설정 지시는 당신의 AppPool을

http://msdn.microsoft.com/en-us/library/ee677260.aspx

완전성 C 추가에 대한 applicationHost.config 파일 설정에서 : \ WINDOWS \ SYSTEM32 \의 inetsrv에 \ config \ applicationHost.config

<applicationPools> 
    <add name=”MyAppPool” startMode=”AlwaysRunning” /> 
</applicationPools> 
15

서버에 ping 할 필요가 없습니다. 다음은 스크린 샷입니다. f 응용 프로그램 풀에 대한 고급 설정에서의 설정. 시작 모드를 AlwaysRunning으로 변경하면 절전 모드가 중지됩니다.

Change Start Mode to AlwaysRunning

+1

이것은 IIS 7.5에만 해당되며 IIS 7.5에는 실제로 – riaandelange

+1

이 없으므로 7.5에서 사용할 수 있으며 applicationHost.config에 숨겨져 있습니다. – Alfred

-1

artfulhacker는 올바른 얻었다. startMode를 AlwaysRunning으로 전환하면 웹 서비스가 항상 라이브로 사용할 수있었습니다.우리는로드 균형 조정을 위해 AAR/Server Farms와 함께 IIS를 사용하고 있습니다. 다음은 IIS6에서 StartMode는 설정의 스크린 샷/WinServer 여기에 2003 IIS6 startMode

0

각 분 자체 호스팅 WCF의 Windows 서비스를 만들고 AppPool을 유휴 timeaout 및 재활용 속성을 비활성화하고 핑 (Ping) 서비스 beetween 타협입니다.

2 가지 이벤트가 있습니다. 5074-IIS Application Pool Recycling 5186-IIS Application Pool Recycling

이러한 유형의 이벤트에 대한 이벤트 핸들러 (실행 PowerShell 스크립트)를 부착하는 것이 가능하다. 여기에 설명 : Trigger a PowerShell Script from a Windows Event

PowerShell 스크립트 :

param($eventRecordID,$eventChannel) 

Start-Sleep -s 1 

$query2 = @" 
    <QueryList><Query Id='0' Path='$eventChannel'><Select Path='$eventChannel'>*[System[(EventRecordID=$eventRecordID)]]</Select></Query></QueryList> 
"@ 

$Events = Get-WinEvent -FilterXml $query2 
if($Events.Count -gt 0) 
{ 
    $evt1 = [xml]$Events[0].toXML() 

    $appPool = $evt1.event.EventData.Data | where { $_.Name -eq 'AppPoolID' } 
    if($appPool) 
    { 
     $appPoolID = $appPool.'#text' 

     switch($appPoolID) 
     { 
      "AppPool" { Invoke-WebRequest -Method Head -Uri http://localhost:8080 } 
      default {} 
     } 
    } 
} 

그래서, 당신의 IIS 서비스 호스팅 때마다 "절전"에 가고, 당신은 부드럽게 깨워.