WebRequestExtensions.GetCurrentNetworkInterface создает исключение InvalidOperationException - PullRequest
2 голосов
/ 17 января 2012

Я хочу получить Network Interface, на котором было сделано HttpWebRequest

Я нашел WebRequestExtensions.GetCurrentNetworkInterface функцию для этого. HttpWebRequest также имеет метод GetCurrentNetworkInterface() для выполнения того же.

Это мой код:

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

Я выполняю вызов метода из потока пользовательского интерфейса. Если я сделал вызов после BeginGetResponse исключение говорит "запрос был завершен". Какой обходной путь для этого?

Информация об исключении:

Сообщение InvalidOperationException

StackTrace:

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

Ответы [ 2 ]

3 голосов
/ 16 февраля 2012
HttpWebRequest httpWebRequest = HttpWebRequest.CreateHttp(new Uri(Url, UriKind.Absolute));

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

var info = WebRequestExtensions.GetCurrentNetworkInterface(httpWebRequest);

У меня недавно была похожая проблема, и я обнаружил, что вы не можете позвонить GetCurrentNetworkInterface до BeginGetResponse (потому что соединение не было установлено), но если вы позвоните ей в , то BeginGetResponse обратный вызов, запрос уже завершен, и вы получаете сообщение об ошибке «Веб-запрос уже завершен».

ДОБАВЛЕНО автором вопроса:

Полностью рабочий код, которыйпозволяет получить 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 голос
/ 15 февраля 2012

Полагаю, вы, возможно, захотите взглянуть на свойство NetworkInterface.NetworkInterfaceType . В документации сказано, что он возвращает тип интерфейса, который обслуживает текущие интернет-запросы.

Если это не то, что вы ищете, вы также можете попробовать DeviceNetworkInformation (я подозреваю, что вы, возможно, уже рассматривали эту опцию.). Я думаю, что вы могли бы использовать статические свойства IsCellularDataEnabled и IsWifiEnabled.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...