C# WebRequest始终命中NetworkError.WebRequestAlreadyFinished
我有一个简单的方法,用于调用WebRequest,如下代码所示。回调总是在C# WebRequest始终命中NetworkError.WebRequestAlreadyFinished,c#,windows-phone-8,httpwebrequest,webrequest,httpwebresponse,C#,Windows Phone 8,Httpwebrequest,Webrequest,Httpwebresponse,我有一个简单的方法,用于调用WebRequest,如下代码所示。回调总是在NetworkError.WebRequestAlreadyFinished上点击。如何修复代码,以便从回调中获取信息 private async void stkWebRequestConnInfo_Tap(object sender, System.Windows.Input.GestureEventArgs e) { HttpWebRequest request = WebRequest.Cr
NetworkError.WebRequestAlreadyFinished
上点击。如何修复代码,以便从回调中获取信息
private async void stkWebRequestConnInfo_Tap(object sender, System.Windows.Input.GestureEventArgs e)
{
HttpWebRequest request = WebRequest.CreateHttp("http://bing.com");
IAsyncResult result = (IAsyncResult)request.BeginGetResponse(new AsyncCallback(response_Callback), request);
}
private void response_Callback(IAsyncResult asyncResult)
{
HttpWebRequest request = (HttpWebRequest)asyncResult.AsyncState;
NetworkInterfaceInfo netInterfaceInfo = null;
try
{
netInterfaceInfo = request.GetCurrentNetworkInterface();
request.EndGetResponse(asyncResult);
}
catch (NetworkException e)
{
// Calling GetCurrentNetworkInterface will throw a NetworkException if the WebRequest has already completed.
// To make this call succeed, make a high latency web request call.
if (e.NetworkErrorCode == NetworkError.WebRequestAlreadyFinished)
{
DisplayMessage(AppResources.MainPage_Info_CannotCallWebRequest, AppResources.MainPage_Info_NetworkInterfaceInformation, MessageBoxButton.OK);
return;
}
else if (e.NetworkErrorCode == NetworkError.NetworkSelectionRequirementFailed)
{
DisplayMessage(AppResources.MainPage_Info_ConnectionRequirementFailed, AppResources.MainPage_Info_NetworkInterfaceInformation, MessageBoxButton.OK);
}
}
catch (WebException e)
{
DisplayMessage(AppResources.MainPage_Info_GeneralError, AppResources.MainPage_Info_WebRequestFailed, MessageBoxButton.OK);
}
// Use a StringBuilder to efficiently build up an information text about this
// NetworkInterfaceInfo.
StringBuilder sb = new StringBuilder();
sb.Append(AppResources.MainPage_Info_Name + " ");
sb.AppendLine(netInterfaceInfo.InterfaceName);
sb.Append(AppResources.MainPage_Info_Type + " ");
sb.AppendLine(GetInterfaceTypeString(netInterfaceInfo.InterfaceType));
DisplayMessage(sb.ToString(), AppResources.MainPage_Info_NetworkInterfaceInformation, MessageBoxButton.OK);
}
void DisplayMessage(string text, string caption, MessageBoxButton buttonConfiguration)
{
Dispatcher.BeginInvoke(() =>
{
MessageBox.Show(text, caption, buttonConfiguration);
});
}
必须从UI线程调用GetCurrentNetworkInterface。因此,使用Dispatcher.BeginInvoke()包装调用 谢谢,我也引用了,但我在执行此操作时将
netInterfaceInfo
返回为null?您能否向我展示一个示例,说明如何正确实现此操作,以调用GetCurrentNetworkInterface
,并在消息框中显示结果?