2012-01-17 84 views
2

我想Network InterfaceHttpWebRequest作出WebRequestExtensions.GetCurrentNetworkInterface拋出InvalidOperationException異常

我發現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) 
+0

讓我猜,InvalidOperationException消息是完全空白的,因爲你沒有發佈它? – 2012-01-17 11:07:54

+0

是的。只有'InvalidOperationException' – Ku6opr 2012-01-17 11:39:18

+0

出於好奇,爲什麼你想要這些信息? – 2012-02-01 23:36:41

回答

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

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

var info = WebRequestExtensions.GetCurrentNetworkInterface(httpWebRequest); 

我最近有一個類似的問題,發現你不能BeginGetResponse之前調用GetCurrentNetworkInterface(因爲連接尚未作出),但如果你把它BeginGetResponse回調的要求已經完成並您收到「Web請求已完成」錯誤。

通過質詢 - 起動機增加:

全工代碼,其允許從後臺線程獲得的HttpWebRequestNetworkInterfaceInfo(在本實施例中使用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(); 

ADDED全天調試後: 我不能讓它工作100%的時間,特別是當加載的頁面很小時。在這種情況下,「請求已完成」一直出現。但是,即使沒有加載大頁面,它也能正常工作EventWaitHandle

+0

是的,我看到一樣。從msdn的例子也有try/catch他們得到網絡信息,所以他們似乎也無法得到它... – Ku6opr 2012-02-16 08:23:45

+0

上述代碼雖然適用於我。在真正的代碼中,我把它放在try/catch中,因爲我認爲可能會阻塞UI線程足夠長的時間,以致在檢索信息之前返回響應。 – Nomad101 2012-02-16 09:40:23

+0

謝謝,夥計。我想,我試圖把這條線放到處,但這是有效的! – Ku6opr 2012-02-16 09:49:41

1

我beleive你可能想看看NetworkInterface.NetworkInterfaceType屬性。該文檔說它返回正在處理當前Internet請求的接口類型。

如果這不是你正在尋找的,你可能還想嘗試DeviceNetworkInformation類(我懷疑你可能已經看過這個選項)。我想你可以使用IsCellularDataEnabled和IsWifiEnabled靜態屬性。

+0

'NetworkInterface.NetworkInterfaceType'不適用於我,因爲我使用網絡要求,因此查詢不在默認網絡接口上執行。此外,我需要'NetworkInterfaceInfo'用於具有此參數的'ResolveHostNameAsync'。我如何以另一種方式獲得它?套接字,我以前用作解決方法,也有一個問題,我今天發現http://stackoverflow.com/questions/9294527/connect-socket-under-lock-screen-on-windows-phone – Ku6opr 2012-02-15 18:35:45