작성자: Dflying Chen ( http://dflying.cnblog.som/ )
Atlas 프로그램의 경우 목록에 있는 사용자가 빠르게 클릭하여 삭제하는 등 짧은 시간에 많은 수의 웹 서비스를 호출해야 하는 경우가 있습니다. . 이때 네트워크 대역폭, 안정성 등으로 인해 지연 시간이 길어지는 경우가 많습니다. 이러한 호출을 단일 요청으로 패키징할 수 있는 경우 사용자는 처리 결과를 얻기 위해 한 번의 네트워크 지연만 견뎌야 하며 이는 간접적으로 효율성도 향상시킵니다. 이는 구현하기 쉬운 기능이 아닌 것 같지만 다행히 Atlas에는 웹 서비스 일괄 호출에 대한 지원이 내장되어 있습니다. 프로그램에서 간단한 설정만 하면 됩니다.
Atlas의 각 웹 서비스 호출 요청에는 0: 높음, 1: 중간, 2: 낮음의 세 가지 우선 순위가 있으며 기본값은 중간입니다.
호출할 때 우선 순위 매개 변수를 통해 이 호출의 우선 순위를 지정할 수 있습니다(ASP.NET Atlas에서 웹 서비스 호출 - 오류 처리, 시간 초과 및 사용자 취소 작업에 응답 참조). 우선순위가 높은 호출의 경우 Atlas는 일괄 호출을 적용하지 않고 매번 즉시 요청을 보냅니다. 우선순위가 중간 및 낮은 우선순위 호출의 경우 Atlas는 특정 시간 내에 호출을 마무리합니다(아래 WebRequestManager 소개를 참조하세요). )을 하나로 개별 요청을 함께 보내거나, 호출할 요청 수가 지정된 수에 도달할 때 전송됩니다(아래 WebRequestManager 소개 참조). 호출할 요청이 너무 많으면 우선순위가 중간인 요청이 먼저 호출되도록 선택됩니다.
Atlas에 내장된 일괄 호출 웹 서비스 지원을 활성화하려면 먼저 web.config에서 일괄 호출 처리를 위한 서버 측 핸들러를 등록해야 합니다(기본 Atlas 웹 사이트 템플릿에서 이 핸들러를 활성화했습니다).
<httpHandlers>
<add verb="*" path="atlasbatchcall.axd" type="Microsoft.Web.Services.MultiRequestHandler" verify="false"/>
</http핸들러>
그런 다음 페이지의 Atlas XML 스크립트에 WebRequestManager의 표시 문을 추가하고 웹 서비스에 대한 일괄 호출을 허용하도록 페이지를 설정합니다. <script type="text/xml-script">
<페이지 xmlns:script=" http://schemas.microsoft.com/xml-script/2005 ">
<구성요소>
<webRequestManageratchSize="5"enableBatching="true"batchDelay="3000" />
</구성요소>
</page>
</script>
여기서 주목해야 할 것은 WebRequestManager의 다음 세 가지 속성입니다.
활성화Batching: 페이지에서 일괄 호출을 허용할지 여부를 설정합니다. 기본값은 false입니다. 여기서는 true로 설정해야 합니다.
BatchSize: 일괄 호출에 포함되는 최대 요청 수를 설정합니다. 기본값은 5입니다. 호출할 요청 수가 이 설정을 초과하는 경우, BatchDelay에 설정된 시간 제한에 도달하지 않더라도 즉시 일괄 요청이 발행됩니다.
BatchDelay: 일괄 호출에 대한 대기 시간 제한을 설정합니다. 기본값은 1000(밀리초)입니다. 대기 시간 제한이 이 설정을 초과하면 배치 크기(batchSize)에 지정된 요청 수에 도달하지 않아도 즉시 일괄 요청이 발행됩니다.
이 설정 후에는 페이지의 모든 웹 서비스 요청에 일괄 호출이 적용됩니다. 따라서 단일 호출의 경우 우선순위를 높음으로 지정해야 합니다.
예를 살펴보겠습니다. 먼저 다음 웹 메서드가 있는 웹 서비스를 작성합니다. 두 매개 변수는 작업 순서(작업 실행 순서를 구별할 수 있음)와 우선 순위를 나타냅니다
.
공개 문자열 DoTask(int taskID, int 우선순위)
{
if (우선순위 < 0 || 우선순위 > 2)
throw new Exception("우선순위는 0, 1 또는 2만 될 수 있습니다!");
return string.Format("작업(ID: {0}, 우선순위: {1})이 완료되었습니다.", taskID, 우선순위);
}
그런 다음 시작 부분의 코드에 따라 web.config에서 일괄 호출을 활성화하고 페이지에 WebRequestManager를 추가하세요. 위에 정의된 웹 서비스를 참조하려면 페이지에 ScriptManager도 필요하다는 점을 잊지 마세요. <atlas:ScriptManager ID= "scriptManager" runat=" 서버">
<서비스>
<atlas:ServiceReference Path="SampleService.asmx" />
</서비스>
</atlas:ScriptManager>
HTML 마크업을 추가합니다. 버튼은 일괄 호출을 트리거하는 데 사용되고 div는 호출 결과를 표시하는 데 사용됩니다.
<input id="invokeTasks" type="button" value="Invoke Task Calls" onclick="return informTasks_onclick()" />
<div id="결과"/>
마지막으로 웹 서비스를 호출하는 JavaScript 스크립트가 있습니다:
함수 InvokeTasks_onclick()
{
// 출력 지우기
$('결과').innerHTML = '';
DoTask(1, 2);
DoTask(1, 1);
DoTask(2, 0);
}
var 작업ID = 0;
함수 DoTask(횟수, 우선순위)
{
for (var i = 0; i < 회; ++i)
{
SampleService.DoTask(
작업ID++,
우선 사항,
{onMethodComplete: OnComplete, 우선순위: 우선순위 }
);
}
}
functionOnComplete(결과)
{
$('결과').innerHTML += 결과 + "<br />";
}
DoTask() 메서드는 두 개의 매개 변수를 허용합니다. times은 호출 수를 지정하는 데 사용되고, 우선 순위는 우선 순위를 지정하는 데 사용되며, 전역 변수 taskID를 사용하여 증가하는 요청 시퀀스를 유지합니다.
이 예에서는 먼저 낮은 우선순위 요청을 호출한 다음 중간 우선순위 요청, 마지막으로 두 개의 높은 우선순위 요청을 호출했습니다.
높은 우선순위는 일괄 호출에 참여하지 않으므로 가장 먼저 보게 되는 것은 해당 결과입니다.
중간 및 낮은 우선순위의 총 개수는 2 이고 아직 5 에 도달하지 않았 으므로 3000 밀리초의 지연 후에 전송됩니다.
InvokeTasks_onclick() 메서드에서 호출 순서와 호출 수를 수정하여 일괄 호출이 구현되는 방식을 분석할 수 있습니다.
샘플 프로그램은 여기에서 다운로드할 수 있습니다.