Verificar conectividade de Web Service
Criei um Web Service simples para ser consumido a partir de uma aplicação Windows Phone 8. Tudo funciona correctamente à excepção de que não consegui arranjar forma de verificar, a partir da aplicação cliente, se o serviço está disponível ou não. De momento ainda estou a testar localmente, mas no futuro pretendo arranjar forma de saber se o Web Service está ou não acessível antes de começar a tentar interagir com ele.
Pelo que li, não há forma de saber se um Web Service está activo sem chamar um dos métodos disponibilizados por ele.
Assim sendo, aqui vai o conteúdo do método LoadData:
public void LoadData(string articleCode = null)
{
try
{
this.ArticleItems.Clear();
MyServiceSoapClient ws = new MyServiceSoapClient();
CheckWebService();
if (this.isWebServiceUp)
{
if (!String.IsNullOrEmpty(articleCode))
{
ws.GetBasicDataAsync(articleCode);
ws.GetBasicDataCompleted += Ws_GetBasicDataCompleted;
this.IsDataLoaded = true;
}
}
else
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = "Could not connect to Web Service." });
ws.Abort();
}
}
}
Com este código, recebo um erro do tipo CommunicationException a dizer que o servidor não está acessível.
Após sugestões que li online, tentei implementar um processo de "heartbeat" mas sem sucesso. Não estou muito à vontade com programação assíncrona e por isso é provável que me esteja a falhar alguma coisa. Segue o código que tenho agora (que devolve uma excepção "Unable to cast object of type 'System.Net.Browser.OHWRAsyncResult' to type 'System.Net.HttpWebResponse'"):
public void CheckWebService()
{
try
{
Uri wsURL = new Uri("http://localhost:60621/WebService1.asmx");
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(wsURL);
request.Method = "HEAD";
//retorna excepção: "Unable to cast object of type 'System.Net.Browser.OHWRAsyncResult' to type 'System.Net.HttpWebResponse'."
using (var response = (System.Net.HttpWebResponse)request.BeginGetResponse(new AsyncCallback(ServiceCallback), request))
{
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
throw new Exception("Error locating web service");
}
}
}
catch (System.ServiceModel.FaultException fe)
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = fe.Message });
}
catch (System.ServiceModel.CommunicationException ce)
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = ce.Message });
}
catch (System.Net.WebException we)
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = we.Message });
}
catch (Exception ex)
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = ex.Message });
}
}
private void ServiceCallback(IAsyncResult asyncResult)
{
try
{
System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)asyncResult.AsyncState;
using (var response = (System.Net.HttpWebResponse)request.EndGetResponse(asyncResult))
{
if (response != null && response.StatusCode == System.Net.HttpStatusCode.OK)
{
this.isWebServiceUp = true;
request.Abort();
}
}
}
catch (Exception ex)
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = ex.Message });
}
}
De alguma forma, penso que posso estar a complicar demasiado a coisa. Há alguma abordagem mais simples que possa seguir?
Obrigado.
Discussão (7)
Carregando comentários...