0

Windows 8 Phone のバッテリー レベルをネットワーク経由で特定の時間間隔で非同期に送信するアプリを作成しています。DispatcherTimer特定の間隔の後にバッテリーレベルを送信するために を使用しています。

DispatcherTimer timer = new DispatcherTimer();      //Create the timer instance
        timer.Interval = TimeSpan.FromSeconds(15);          //Set the timer interval
        timer.Tick += SendAsyncRequest;                     //Call this procedure after the time ends

        timer.Start();  

POSTリクエストを使用してバッテリーレベルを送信したい。

void SendAsyncRequest(object sender, object e)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.2.17/android_connect/add_device.php");            
        request.Method = "POST";
        request.BeginGetRequestStream(new AsyncCallback(SendBatteryLevel), request);

    }

ここで、実際のリクエスト ( ) を送信するコードの中心はSendBatteryLevel次のとおりです。

void SendBatteryLevel(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        using (Stream postStream = request.EndGetRequestStream(asynchronousResult))
        {
            string username = "CoolSops";
            string deviceId = "WindowsPhone";
            string batteryLevel = Windows.Phone.Devices.Power.Battery.GetDefault().RemainingChargePercent.ToString();
            string post_param = "username=" + username + "&device_id=" + deviceId + "&battery_level=" + batteryLevel;
            try
            {
                byte[] requestBody = System.Text.Encoding.UTF8.GetBytes(post_param);
                postStream.Write(requestBody, 0, requestBody.Length);
                SendingStatus.Text = "Battery data sent";
                postStream.Close();
            }
            catch (Exception e)
            {
                Deployment.Current.Dispatcher.BeginInvoke(() =>
                {
                    ErrorStatus.Text = e.ToString();
                });                   
                Console.WriteLine(e.Message + "\n\n" + e.Source + "\n\n" + e.StackTrace);
            }
        }           
    }

SendingStatusErrorStatusはどこTextBlockですか。このコードを実行すると、System.UnauthorizedAccessException. 例外の詳細は次のとおりです。

A first chance exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll
An exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll and wasn't handled before a managed/native boundary

不正な方法で何にアクセスしようとしているのかわかりません。なぜこれが起こっているのか誰にもわかりますか?

注: プログラムのデバッグ中に興味深いことに気付きました。メソッドからメソッドSendBatteryLevelが呼び出されると、コントロールSendAsyncRequestから数行を実行した後SendBatteryLevel、コントロールは に戻りSendAsyncRequestます。コントロールが戻った後の正確な行数を把握しようとしましたSendAsyncRequestが、毎回異なります。そのため、SendBatteryLevelメソッドが完全に実行される前に、この方法でメソッドが 2 回、場合によっては 3 回呼び出されます。これが原因で例外が発生している可能性があります。

4

2 に答える 2

0

必要なすべての機能を WMAppManifest.xml に設定しましたか?

ID_CAP_IDENTITY_DEVICE、ID_CAP_IDENTITY_USER、または ID_CAP_NETWORKING を有効にするのを忘れているようです。

どこで例外を取得しますか? バッテリーの状態を取得できますか?

于 2013-03-11T12:59:53.013 に答える
0

バイト配列の操作は、より簡単な方法で行うことができます。
またContentLength、応答ストリームを取得する前に を設定する必要があります。

これを試して:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://192.168.2.17/android_connect/add_device.php");
request.Method = "POST";

string username = "CoolSops";
string deviceId = "WindowsPhone";
string batteryLevel = Windows.Phone.Devices.Power.Battery.GetDefault().RemainingChargePercent.ToString();
string post_param = "username=" + username + "&device_id=" + deviceId + "&battery_level=" + batteryLevel;

byte[] requestBody = System.Text.Encoding.UTF8.GetBytes(post_param);

request.ContentLength = requestBody.Length;

request.BeginGetRequestStream(
    result =>
    {
        using (var postStream = request.EndGetRequestStream(result))
        {
            postStream.Write(requestBody, 0, requestBody.Length);
            postStream.Close();
        }

        request.BeginGetResponse(
            (response) =>
            {
                // Handle response here....
            },
            null);
    },
request);
于 2013-03-07T16:42:58.337 に答える