Autor: Dflying Chen ( http://dflying.cnblogs.com/ )
No artigo anterior desta série (Chamando Web Service no ASP.NET Atlas - Introdução e Aplicação Simples), estávamos familiarizados com o método mais básico de chamar Web Service no Atlas, mas no desenvolvimento real, apenas fazemos uma solicitação e esperamos .Retornar resultados não é suficiente. A maioria de nós precisa considerar o tratamento de tempos limite de erro, etc., e também permitir que os usuários cancelem operações. Felizmente, o encapsulamento do Método Web no Serviço Web pelo Atlas também leva essas necessidades em consideração.
Vamos dar um exemplo de método Web para ilustrar. Por exemplo, para o seguinte método Web:
public class ComplexWebService: System.Web.Services.WebService {
[WebMethod]
string pública BadMethod(int delayTime, bool throwException)
{
//algo alguma coisa
}
}
O mash up JavaScript gerado pelo Atlas terá a seguinte assinatura: ComplexWebService.BadMethod(
atrasoTempo,
throwException,
onMethodComplete,
onMethodTimeout,
onMethodError,
onMethodAbortado,
userContext,
intervalo de tempo limite,
prioridade,
useGetMethod,
);
Observe que os dois parâmetros no método Web são usados como os dois primeiros parâmetros do método JavaScript em ordem e há alguns parâmetros adicionais:
onMethodComplete: especifica o nome da função de retorno de chamada que é acionada quando o método é concluído e retorna com sucesso. Em geral, você deve sempre especificar este método.
onMethodTimeout,: Especifica o nome da função que é acionada quando a execução do método atinge o tempo limite.
onMethodError: especifica o nome da função que é acionada quando o método encontra uma exceção durante a execução.
onMethodAborted: Especifique o nome da função que é acionada quando o método é cancelado pelo usuário durante a execução.
userContext: objeto de contexto do usuário, que pode ser acessado nas quatro funções acima.
timeoutInterval: Defina o limite de tempo limite em milissegundos. O valor padrão parece ser 90.000. Normalmente nenhuma alteração é necessária.
prioridade: Defina a prioridade de execução deste método. Esta prioridade será usada em operações AJAX em lote (mencionadas no próximo artigo).
useGetMethod: se deve usar HTTP GET para enviar solicitações, o padrão é falso.
A ordem dos oito atributos acima deve ser a especificada. Mas às vezes só precisamos especificar um parâmetro posteriormente no pedido e temos que escrever os parâmetros anteriores ao mesmo tempo. Por esse motivo, o Atlas nos fornece especialmente outro método de chamada, passando os oito parâmetros acima para o método na forma de um dicionário. Por exemplo, quando precisamos apenas dos parâmetros onMethodComplete e timeoutInterval, podemos escrever assim:
ComplexWebService.BadMethod(
atrasoTempo,
throwException,
{
onMethodComplete: completeHandler,
intervalo de tempo limite: 10000
}
);
OK, vamos dar uma olhada no processamento comum nas quatro funções de retorno de chamada acima (onMethodComplete, onMethodTimeout, onMethodError e onMethodAborted) em circunstâncias normais por meio de um exemplo.
Primeiro vamos completar o método Web Service no início:
using System;
usando System.Web;
usando System.Web.Services;
usando System.Web.Services.Protocols
[WebService(Namespace = " http://tempuri.org/ ")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
classe pública ComplexWebService: System.Web.Services.WebService {
[WebMethod]
string pública BadMethod(int delayTime, bool throwException)
{
if(throwException)
{
throw new Exception("Desculpe, não gosto de fazer isso!");
}
System.Threading.Thread.Sleep(delayTime);
retorne "Concluído!";
}
}
Você pode ver que esse método possui dois parâmetros: delayTime especifica o atraso do método e throwException especifica se o método lança uma exceção. Ao controlar esses dois parâmetros e o parâmetro timeoutInterval durante a chamada, podemos simular situações de conclusão, tempo limite e exceção.
Em seguida, adicione ScriptManager à página e adicione uma referência a este Web Service:
<atlas:ScriptManager ID="ScriptManager1" runat="server">
<Serviços>
<atlas:ServiceReference Path="ComplexWebService.asmx" />
</Serviços>
</atlas:ScriptManager>
Adicione quatro botões à página ASPX para acionar as quatro situações a seguir: <div>
Este é um método RUIM, pode:<br />
<input id="btnWorkFine" type="button" value="funciona bem" onclick="return btnWorkFine_onclick()" />
<input id="btnTimeOut" type="button" value="timeout" onclick="return btnTimeOut_onclick()" />
<input id="btnThrowException" type="button" value="lançar uma exceção" onclick="return btnThrowException_onclick()" />
<input id="btnCanceld" type="button" value="ser cancelado" onclick="return btnCanceld_onclick()" />
</div>
Concluído normalmente, não especificamos nenhum atraso ou exceção no lado do servidor e fornecemos um tempo limite razoável (10 segundos):
function btnWorkFine_onclick() {
ComplexWebService.BadMethod(
0,
falso,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAbortado,
"btnWorkFine_onclick",
10.000
);
}
função onBadMethodComplete(resultado)
{
alerta(resultado);
}
Tempo limite, especifique o atraso do lado do servidor de 3 segundos, mas o tempo limite é definido para apenas 1 segundo:
function btnTimeOut_onclick() {
ComplexWebService.BadMethod(
3.000,
falso,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAbortado,
"btnTimeOut_onclick",
1000
);
}
função onBadMethodTimeout (solicitação, userContext)
{
var timeoutString = "A chamada para '" + userContext + "' falhou devido ao tempo limite!";
alerta(timeoutString);
}
Exceção, especifique a exceção lançada pelo servidor. Observe que você pode usar o parâmetro de resposta na função de retorno de chamada para obter informações detalhadas sobre o erro:
function btnThrowException_onclick() {
ComplexWebService.BadMethod(
0,
verdadeiro,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAbortado,
"btnThrowException_onclick",
10.000
);
}
função onBadMethodError(resultado, resposta, userContext)
{
var errorString = "Teste '" + userContext + "' falhou!";
if (resultado == nulo) {
errorString += "Código de status='" + response.get_statusCode() + "'";
}
outro {
string de erro +=
"Mensagem='" + resultado.get_message() +
"'rnstackTrace = " + result.get_stackTrace();
}
alerta(erroString);
}
Cancelamento do usuário, semelhante à conclusão normal, mas usando request.abort() para cancelar a operação imediatamente após fazer a solicitação:
function btnCanceld_onclick() {
var solicitação = ComplexWebService.BadMethod(
2000,
falso,
onBadMethodComplete,
onBadMethodTimeout,
onBadMethodError,
onBadMethodAbortado,
"btnCanceld_onclick",
10.000
);
request.abort();
}
function onBadMethodAborted(solicitação, userContext) {
var errorString = "A chamada para '" + userContext + "' falhou, a solicitação foi abortada!";
alerta(erroString);
}
O programa de exemplo pode ser baixado aqui: