2013-09-17 2 views
1

Первый раз в секунду.HttpWebRequest Сообщение WP8

Хорошо, поэтому у меня есть это приложение, которое я создаю для проекта класса, и я пытаюсь выполнить запрос на отправку для телефона Windows 8. Я как бы новичок в C# и windows phone dev. Это моя первая попытка, но я хорошо понимаю принципы программирования.

Проблема заключается в том, что Visual Studio возвращает некоторые исключения в консоли отладчика прямо до или после того, как я назначил текстовое свойство Text в postData.

Может кто-нибудь помочь мне выяснить, почему это происходит и/или какой материал 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); 
      } 

     } 

    } 
} 
+4

Зачем давать -1 для этого вопроса и не предоставлять даже номинальное количество информации, чтобы объяснить, почему вопрос может быть не совсем уместным? Этот пользователь, очевидно, новичок и изучает веревки. Прыжки на голосование без доказательства информации просто идиот. – Subby

ответ

1

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

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

Вы получаете исключение, все внутренние исключения и трассировку стека из этого. Вставьте это в вопрос вместе с кодом poopy, и вы почти всегда получите ответ (если вы не поймете это сами).

Ваша проблема в том, что вы не указали, что вам необходимо использовать сеть. Вы не можете просто набирать ресурсы, такие как геолокация, сеть, SMS и т. Д., Не сообщая владельцу телефона, что вы собираетесь делать. В противном случае, я бы отправил ваш список контактов на свой сервер в России, пока вам понравилось мое милое приложение для кошек.

Поэтому вам нужно отредактировать свой app manifest file и указать каждый контролируемый ресурс по телефону, который вам нужен для работы вашего приложения. Вы можете найти a list of all protected resources here. Прочтите его и посмотрите, что использует ваше приложение.


Ну, теперь мы знаем, что настоящая проблема связана с резьбой. Асинхронные операции начинаются с одного потока и (как правило, без дополнительной работы) заканчиваются на другом. Поэтому ButtonFuction начинается в одном потоке (поток пользовательского интерфейса), а GetRequestStreamCallback работает на другом.

Элементы пользовательского интерфейса имеют «сродство к потоку», что означает, что они могут быть затронуты только кодом, выполняемым в потоке пользовательского интерфейса. Я позволю вам найти причины. Вы пытаетесь прикоснуться к элементам пользовательского интерфейса (textBlock1.Text) в потоке, который не является потоком пользовательского интерфейса. Таким образом, исправление заключается в том, чтобы прекратить это делать.

О, как? Пара по-разному. Вы можете использовать поток пользовательского интерфейса Dispatcher, чтобы вызывать метод поверх потока пользовательского интерфейса, но вы действительно хотите приостановить его до тех пор, пока не будете выполнены все ваши фоновые потоки. Итак, чтобы сделать это как можно проще, зачитайте содержимое в потоке пользовательского интерфейса, введите его во временную переменную и прочитайте это в фоновом потоке.

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); 

    } 

Теперь вы, вероятно, хотите, чтобы пропустить обратно в потоке пользовательского интерфейса, когда сделано (вместо того, чтобы бросать вещи в Debug), так что вы должны будете использовать интерфейс Dispatcher (например, textBlock1.Dispatcher) в Invoke(() => textBlock1.Text = "some result etc"); (примечание , это не так просто, вам придется исследовать, как вызывать в первую очередь).

+0

Возможность уже включена. Форма результата try catch: System.UnauthorizedAccessException: Недопустимый доступ к перекрестным потокам. на MS.Internal.XcpImports.CheckThread() в System.Windows.DependencyObject.GetValueInternal (DependencyProperty др) в System.Windows.FrameworkElement.GetValueInternal (DependencyProperty др) в System.Windows.Controls.TextBox.get_Text() на PhoneApp1.MainPage.GetRequestStreamCallback (IAsyncResult asynchronousResult) Thanx для ответа. – user2788573

0

Я столкнулся с такой же ошибкой, не имея понятия, как понять, что было не так, благодаря ответам здесь я узнал, что не использовал все возможности, необходимые для моего приложения.

Теперь я узнал, как исследовать, когда это случится это :)

Спасибо !!!

Смежные вопросы