First Time Stackoverflow。
好的,所以我有这个应用程序,我正在为类项目做,我正在尝试实现Windows Phone 8的发布请求。我是C#和windows phone dev的新手。这是我的第一次尝试,但我对编程原则有很好的理解。
问题是Visual Studio在postData分配文本框的Text属性之前或之后,在调试器控制台中返回一些异常。
任何人都可以帮我弄清楚为什么会发生这种情况和/或我应该研究C#/ Windows Phone Dev的哪些材料来了解正在发生的事情。
非常感谢任何帮助 - Thnx提前。
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);
}
}
}
}
答案 0 :(得分:1)
首先,无论何时遇到这种情况(未处理的异常)都会让您感到无能为力,请务必抓住并检查它。
try
{
// code poops exception
}catch(Exception ex)
{
// place a breakpoint below
var thisIsAllYouNeed = ex.ToString();
}
您将获得异常,所有内部异常以及来自该异常的堆栈跟踪。将其与问题代码一起粘贴到问题中,您几乎总能得到答案(如果您不自己解决)。
您的问题是您没有指定需要使用网络。您不仅可以在不告诉电话所有者您将要执行的操作的情况下获取地理位置,网络,短信等资源。否则,当你喜欢我的可爱的猫咪应用程序时,我会把你的联系人名单发送到我在俄罗斯的服务器上。
因此,您需要修改app manifest file并指定手机上应用所需的每个受控资源。你可以找到a list of all protected resources here。阅读它,看看您的应用使用了什么。
好吧,现在我们知道真正的问题是线程化。 Asynch操作从一个线程开始,(通常,不做额外的工作)在另一个线程上结束。因此ButtonFuction
在一个线程(UI线程)上启动,GetRequestStreamCallback
在另一个线程上运行。
UI元素具有“线程亲和力”,这意味着它们只能被UI线程中执行的代码触及。我会让你搜索原因。您试图在不是UI线程的线程上触摸UI元素(textBlock1.Text
)。所以,解决方法是停止这样做。
Dispatcher
来调用UI线程上的方法,但是您真的想要暂时不要这样做,直到完成所有后台线程工作。因此,为了使其尽可能简单,请读出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
(例如,{{ 1}})到textBlock1.Dispatcher
(注意,它不是那么容易,你必须先研究如何调用)。
答案 1 :(得分:0)
我遇到了同样的错误,不知道怎么弄清楚出了什么问题,多亏了这里的答案,我发现我并没有把我应用程序所需的全部功能都用掉。
现在我学会了如何调查它发生的时间:))
感谢!!!