C# 检查Web服务连接
我开发了一个简单的Web服务和一个WindowsPhone8应用程序来使用它。 一切都按预期工作,但按照我当前(工作)代码的方式,它假设Web服务始终运行并可用。考虑到情况并非总是如此,我想在开始发送请求之前尝试添加一些连接测试。我已经读到,除了以某种方式查询它之外,没有直接的方法可以确定WS是否已经启动并运行 记住这一点,下面是我的加载数据方法结构的样子(2月26日): 它仍然会抛出一个错误 编辑:在考虑了这两个建议并进行了一些搜索之后,我尝试设置一个“心跳”类型的方法,但它无法正常工作。异步编程对我来说是一个相对较新的范例,因此我很可能遗漏了一些东西,但我到目前为止的实现尝试如下(得到一个“无法将'System.Net.Browser.OHWRAsyncResult'类型的对象强制转换为'System.Net.HttpWebResponse'”异常):C# 检查Web服务连接,c#,web-services,windows-phone-8.1,C#,Web Services,Windows Phone 8.1,我开发了一个简单的Web服务和一个WindowsPhone8应用程序来使用它。 一切都按预期工作,但按照我当前(工作)代码的方式,它假设Web服务始终运行并可用。考虑到情况并非总是如此,我想在开始发送请求之前尝试添加一些连接测试。我已经读到,除了以某种方式查询它之外,没有直接的方法可以确定WS是否已经启动并运行 记住这一点,下面是我的加载数据方法结构的样子(2月26日): 它仍然会抛出一个错误 编辑:在考虑了这两个建议并进行了一些搜索之后,我尝试设置一个“心跳”类型的方法,但它无法正常工作。异步
向服务中添加“heartbeat”方法。这是一种只发送回确认消息的方法。在会话开始时,呼叫心跳,如果你得到确认,你是金黄色的,如果没有,由于某种原因,服务不可用。我尝试过这样做,但没有成功。更新帖子以反映变化。
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;
//(irrelevant code supressed for clarity)
this.IsDataLoaded = true;
}
}
else
{
this.ArticleItems.Add(new ItemViewModel() { LineOne = "Could not connect to Web Service." });
ws.Abort();
}
}
}
public void CheckWebService()
{
try
{
Uri wsURL = new Uri("http://localhost:60621/WebService1.asmx");
//try accessing the web service directly via its URL
var request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(wsURL);
request.Method = "HEAD";
//next line throws: "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)
{
throw new Exception(ex.Message);
}
}