WebRequestExtensions.GetCurrentNetworkInterface抛出InvalidOperationException

时间:2012-01-17 09:45:15

标签: windows-phone-7

我希望Network Interface获得HttpWebRequest

我找到了WebRequestExtensions.GetCurrentNetworkInterface功能。 HttpWebRequest也有GetCurrentNetworkInterface()方法来执行相同操作。

这是我的代码:

 HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp(new Uri(Url, UriKind.Absolute)); 
 //this line throws InvalidOperationException       
 NetworkInterfaceInfo i = httpWebRequest.GetCurrentNetworkInterface();

我从UI线程执行方法调用。如果我在BeginGetResponse异常告诉“请求已完成”后拨打电话。解决方法是什么?

异常信息:

消息为InvalidOperationException

堆栈跟踪:

  at System.Net.Browser.ClientHttpWebRequest.GetConnectionDetails(IntPtr& Details, Int32& sizeofDetails)
  at Microsoft.Phone.Net.NetworkInformation.WebRequestExtensions.GetCurrentNetworkInterface(WebRequest request)

2 个答案:

答案 0 :(得分:3)

HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp(new Uri(Url, UriKind.Absolute));

httpWebRequest.BeginGetResponse(result =>
{
    // Handle response
}, null);

var info = WebRequestExtensions.GetCurrentNetworkInterface(httpWebRequest);

我最近遇到了类似的问题,发现您无法在GetCurrentNetworkInterface之前致电BeginGetResponse(因为尚未建立连接),但如果您在中将其称为请求已经完成的BeginGetResponse回调,并且您收到“Web请求已完成”错误。

由问题首发添加:

允许从后台线程获取NetworkInterfaceInfo HttpWebRequest的全工作者代码(在此示例中使用BackgroundWorker来模拟此情况):

BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (s, 4) =>
{
    HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp(new Uri("http://stackoverflow.com", UriKind.Absolute));

    EventWaitHandle Wait = new AutoResetEvent(false);

    httpWebRequest.BeginGetResponse(result =>
    {
        Wait.Set();
    }, null);

    Wait.WaitOne();
    Deployment.Current.Dispatcher.BeginInvoke(() =>
    {                        
        var info = WebRequestExtensions.GetCurrentNetworkInterface(httpWebRequest);
        MessageBox.Show(info.InterfaceType.ToString());
    });
};
backgroundWorker.RunWorkerAsync();

在全天调试后添加: 我不能让它100%工作,特别是当加载的页面很小时。在这种情况下,“请求已完成”始终出现。但是对于大型加载页面,即使没有EventWaitHandle

也可以使用

答案 1 :(得分:1)

我相信你可能想看看NetworkInterface.NetworkInterfaceType财产。文档说它返回为当前互联网请求提供服务的接口类型。

如果这不是你想要的,你可能还想尝试DeviceNetworkInformation课程(我怀疑你可能已经看过这个选项。)。我想你可以使用IsCellularDataEnabled和IsWifiEnabled静态属性。