1

第一次 Stackoverflow。

好的,所以我有这个应用程序,我正在为课堂项目制作,我正在尝试为 windows phone 8 实现发布请求。我是 C# 和 windows phone 开发的新手。这是我的第一次尝试,但我对编程原理有很好的理解。

问题是在我在 postData 分配文本框的 Text 属性之前或之后,Visual Studio 在调试器控制台中返回了一些异常。

谁能帮我弄清楚为什么会发生这种情况和/或我应该研究什么 C#/Windows Phone Dev 材料以了解发生了什么。

非常感谢任何帮助 - 提前谢谢。

An exception of type 'System.IO.FileNotFoundException' occurred in mscorlib.ni.dll and wasn't handled before a managed/native boundary
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 but was not handled in user code

这是代码。

using System;
    using System.Diagnostics;
    using System.Text;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Navigation;
    using Microsoft.Phone.Controls;
    using Microsoft.Phone.Shell;
    using PhoneApp1.Resources;

    namespace PhoneApp1
    {
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {

            InitializeComponent();

        }

        private void ButtonFuction(object sender, RoutedEventArgs e)
        {

            var request = HttpWebRequest.Create("http://www.foo.com") as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "application/x-www-form-urlencoded";
            request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

        }

        private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
            // End the stream request operation
            Stream postStream = request.EndGetRequestStream(asynchronousResult);

            // Create the post data
            string postData = "blah=" + textBlock1.Text + "&blah=" + textBlock2.Text + "&blah=moreblah";

            byte[] byteArray = Encoding.UTF8.GetBytes(postData);


            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            //Start the web request
            request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);

        }

        void GetResponceStreamCallback(IAsyncResult callbackResult)
        {
            HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState;
            HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult);
            using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream()))
            {
                string result = httpWebStreamReader.ReadToEnd();
                //For debug: show results
                Debug.WriteLine(result);
            }

        }

    }
}
4

2 回答 2

1

首先,每当您遇到这种让您一无所知的情况(未处理的异常)时,请确保您抓住并检查它。

try
{
    // code poops exception
}catch(Exception ex)
{
    // place a breakpoint below
    var thisIsAllYouNeed = ex.ToString();
}

您会从中获得异常、所有内部异常以及堆栈跟踪。将其与便便代码一起粘贴到问题中,您几乎总能得到答案(如果您自己没有弄清楚)。

您的问题是您没有指定需要使用网络。您不能在不告诉手机所有者您将要做什么的情况下就获取地理定位、网络、短信等资源。否则,当您喜欢我可爱的猫应用程序时,我会将您的联系人列表发送到我在俄罗斯的服务器。

因此,您需要编辑您的应用清单文件并指定您的应用运行所需的手机上的每个受控资源。您可以在此处找到所有受保护资源的列表。阅读并查看您的应用程序使用什么。


好吧,现在我们知道真正的问题是线程。异步操作从一个线程开始,(通常不做额外工作)在另一个线程结束。因此ButtonFuction从一个线程(UI 线程)开始,然后GetRequestStreamCallback在另一个线程上运行。

UI 元素具有“线程亲和性”,这意味着它们只能被在 UI 线程中执行的代码所触及。我会让你搜索原因。您正在尝试textBlock1.Text在不是 UI 线程的线程上触摸 UI 元素 ( )。因此,解决方法是停止这样做。

哦,怎么样?几种不同的方式。您可以使用 UI 线程在 UI 线程上Dispatcher调用一个方法,但您确实希望推迟此操作,直到您完成所有后台线程工作。因此,为了尽可能简单,请在 UI 线程上读取内容,将其放入临时变量中,然后在后台线程上读取。

    private void ButtonFuction(object sender, RoutedEventArgs e)
    {

        // Create the post data
        _lolThreading = "blah=" + textBlock1.Text + "&blah=" + textBlock2.Text + "&blah=moreblah";

        var request = HttpWebRequest.Create("http://www.foo.com") as HttpWebRequest;
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

    }

    private string _lolThreading;

    private void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the stream request operation
        Stream postStream = request.EndGetRequestStream(asynchronousResult);

        // avoid bad-touching UI stuff
        byte[] byteArray = Encoding.UTF8.GetBytes(_lolThreading);

        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();

        //Start the web request
        request.BeginGetResponse(new AsyncCallback(GetResponceStreamCallback), request);

    }

现在,您可能希望在完成后跳过 UI 线程(而不是将东西扔到Debug),因此您必须使用 UI Dispatcher(例如,textBlock1.Dispatcher)来Invoke(() => textBlock1.Text = "some result etc");(注意,这并不那么容易,您'将不得不研究如何首先调用)。

于 2013-09-17T19:09:41.907 回答
0

我遇到了同样的错误,不知道如何找出问题所在,多亏了这里的答案,我发现我没有提供我的应用程序所需的所有功能。

现在我学会了如何在发生这种情况时进行调查:)

谢谢!!!

于 2014-01-16T05:57:38.797 回答