작성자: Dflying Chen ( http://dflying.cnblogs.com/ )
이 시리즈의 이전 기사(ASP.NET Atlas에서 웹 서비스 호출 - 소개 및 간단한 응용 프로그램)에서는 Atlas에서 웹 서비스를 호출하는 가장 기본적인 방법에 대해 익숙했지만 실제 개발에서는 요청하고 기다리기만 하면 됩니다. 결과를 반환하는 것만으로는 충분하지 않습니다. 대부분의 경우 오류 시간 초과 처리를 고려해야 하며 사용자가 작업을 취소할 수 있도록 허용해야 합니다. 다행스럽게도 Atlas는 웹 서비스에 웹 메서드를 캡슐화하여 이러한 요구 사항을 충분히 고려했습니다.
예를 들어 다음 웹 메서드에 대해 설명하기 위해 웹 메서드의 예를 들어보겠습니다.
public class ComplexWebService : System.Web.Services.WebService {
[WebMethod]
공개 문자열 BadMethod(int DelayTime, bool throwException)
{
// 뭔가 뭔가
}
}
Atlas가 생성한 JavaScript 매시업에는 다음과 같은 서명이 있습니다: ComplexWebService.BadMethod(
지연시간,
던져예외,
onMethod완료,
onMethodTimeout,
onMethodError,
onMethodAborted,
사용자컨텍스트,
시간 초과 간격,
우선 사항,
사용Get메소드,
);
웹 메서드의 두 매개 변수는 순서대로 JavaScript 메서드의 처음 두 매개 변수로 사용되며 몇 가지 추가 매개 변수가 있습니다.
onMethodComplete: 메서드가 완료되고 성공적으로 반환될 때 트리거되는 콜백 함수의 이름을 지정합니다. 일반적으로 항상 이 방법을 지정해야 합니다.
onMethodTimeout,: 메서드 실행 시간이 초과될 때 트리거되는 함수 이름을 지정합니다.
onMethodError: 메서드 실행 중에 예외가 발생할 때 트리거되는 함수 이름을 지정합니다.
onMethodAborted: 실행 중 사용자가 메서드를 취소할 때 트리거되는 함수의 이름을 지정합니다.
userContext: 위의 네 가지 함수에서 액세스할 수 있는 사용자 컨텍스트 개체입니다.
timeoutInterval: 제한 시간을 밀리초 단위로 설정합니다. 기본값은 90000인 것 같습니다. 일반적으로 변경이 필요하지 않습니다.
우선 순위: 이 메서드의 실행 우선 순위를 설정합니다. 이 우선순위는 일괄 AJAX 작업에 사용됩니다(다음 문서에서 언급).
useGetMethod: HTTP GET을 사용하여 요청을 보낼지 여부, 기본값은 false입니다.
위 8개 속성의 순서는 지정된 대로 이루어져야 합니다. 그러나 때로는 순서의 뒷부분에 매개변수만 지정하면 되고 이전 매개변수도 동시에 작성해야 하는 경우가 있습니다. 이러한 이유로 Atlas는 위의 8개 매개 변수를 사전 형식으로 메서드에 전달하는 또 다른 호출 메서드를 특별히 제공합니다. 예를 들어 onMethodComplete 및 timeoutInterval 매개변수만 필요한 경우 다음과 같이 작성할 수 있습니다.
ComplexWebService.BadMethod(
지연시간,
던져예외,
{
onMethodComplete: 완전한 핸들러,
시간 초과 간격: 10000
}
);
자, 예제를 통해 일반적인 상황에서 위의 4개 콜백 함수(onMethodComplete, onMethodTimeout, onMethodError 및 onMethodAborted)의 일반적인 처리를 살펴보겠습니다.
먼저 처음부터 웹 서비스 메서드를 완성해 보겠습니다.
using System;
System.Web 사용;
System.Web.Services 사용;
System.Web.Services.Protocols 사용;
[WebService(Namespace = " http://tempuri.org/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
공용 클래스 ComplexWebService : System.Web.Services.WebService {
[WebMethod]
공개 문자열 BadMethod(int DelayTime, bool throwException)
{
if(throwException)
{
throw new Exception("죄송합니다. 저는 이 작업을 하고 싶지 않습니다!");
}
System.Threading.Thread.Sleep(delayTime);
"완료!"를 반환합니다.
}
}
이 메소드에는 두 개의 매개변수가 있음을 알 수 있습니다. DelayTime은 메소드의 지연을 지정하고, throwException은 메소드가 예외를 발생시키는지 여부를 지정합니다. 호출 시 이 두 매개변수와 timeoutInterval 매개변수를 제어함으로써 완료, 시간 초과 및 예외 상황을 시뮬레이션할 수 있습니다.
그런 다음 페이지에 ScriptManager를 추가하고 다음 웹 서비스에 대한 참조를 추가합니다.
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<서비스>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</서비스>
</atlas:ScriptManager>
다음 네 가지 상황을 트리거하려면 ASPX 페이지에 네 개의 버튼을 추가하세요.
이는 나쁜 방법입니다.<br />
<input id="btnWorkFine" type="button" value="작동 잘됨" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="예외 발생" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="취소됨" onclick="return btnCanceld_onclick()" />
</div>
정상적으로 완료되었으며 서버 측에서 지연이나 예외를 지정하지 않았고 합리적인(10초) 시간 초과를 제공했습니다.
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0,
거짓,
onBadMethod완료,
onBadMethodTimeout,
onBadMethodError,
onBadMethod중단됨,
"btnWorkFine_onclick",
10000
);
}
onBadMethodComplete(결과) 함수
{
경고(결과);
}
시간 초과, 서버 측 지연을 3초로 지정하지만 시간 초과는 1초로만 설정됩니다.
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3000,
거짓,
onBadMethod완료,
onBadMethodTimeout,
onBadMethodError,
onBadMethod중단됨,
"btnTimeOut_onclick",
1000
);
}
onBadMethodTimeout(요청, userContext) 함수
{
var timeoutString = "'" + userContext + "'에 대한 호출이 시간 초과로 인해 실패했습니다!";
경고(timeoutString);
}
예외, 서버에서 발생한 예외를 지정합니다. 콜백 함수의 응답 매개변수를 사용하여 자세한 오류 정보를 얻을 수 있습니다.
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
진실,
onBadMethod완료,
onBadMethodTimeout,
onBadMethodError,
onBadMethod중단됨,
"btnThrowException_onclick",
10000
);
}
onBadMethodError(결과, 응답, userContext) 함수
{
var errorString = "테스트 '" + userContext + "' 실패!";
if (결과 == null) {
errorString += " 상태 코드='" + response.get_statusCode() + "'";
}
또 다른 {
오류문자열 +=
" 메시지='" + result.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
경고(errorString);
}
사용자 취소, 일반 완료와 유사하지만 request.abort()를 사용하여 요청 후 즉시 작업을 취소합니다.
function btnCanceld_onclick() {
var 요청 = ComplexWebService.BadMethod(
2000년,
거짓,
onBadMethod완료,
onBadMethodTimeout,
onBadMethodError,
onBadMethod중단됨,
"btnCanceld_onclick",
10000
);
요청.중단();
}
함수 onBadMethodAborted(요청, userContext) {
var errorString = "'" + userContext + "'에 대한 호출이 실패하여 요청이 중단되었습니다!";
경고(errorString);
}
샘플 프로그램은 여기에서 다운로드할 수 있습니다.