none
Response Zugriffsproblem RRS feed

  • Frage

  • Hallo, 
    

    ich möchte über einen WebRequest XML-Daten von einem php-Script abrufen. Theoretisch klappt auch alles. Wenn ich aber auf das Ergebnis des Requests (Response) zugreife, bekomme ich eine AccessException.

    System.UnauthorizedAccessException wurde nicht behandelt.
      Message=Invalid cross-thread access.
      StackTrace:
        bei MS.Internal.XcpImports.CheckThread()
        bei MS.Internal.XcpImports.MessageBox_ShowCore(String messageBoxText, String caption, UInt32 type)
        bei System.Windows.MessageBox.ShowCore(String messageBoxText, String caption, MessageBoxButton button)
        bei System.Windows.MessageBox.Show(String messageBoxText)
        bei WindowsPhoneVV1.FreieWohnung.GetResponseCallback(IAsyncResult asynchronousResult)
        bei System.Net.Browser.ClientHttpWebRequest.<>c__DisplayClassa.<InvokeGetResponseCallback>b__8(Object state2)
        bei System.Threading.ThreadPool.WorkItem.doWork(Object o)
        bei System.Threading.Timer.ring()
    

    Zu folgendem Code:

            void GetResponseCallback(IAsyncResult asynchronousResult)
            {
                try
                {
                    HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
                    HttpWebResponse response;
    
                    // Abschliessen des Requests 
                    response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
                    Stream streamResponse = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(streamResponse);
                    string zXML = streamReader.ReadToEnd();
                    streamResponse.Close();
                    streamReader.Close();
                    response.Close();
                    MessageBox.Show(<strong>zXML</strong>);
                }
                catch (WebException e)
                {
                    MessageBox.Show(e.Message);  // Fehler
                }
            }
    

    Wenn ich den String zXML mit dem Debugger ansehe, wird sogar das richtige XML-Dokument angezeigt, aber programmtechnisch kann ich nicht darauf zugreifen?!!

    Hat jemand eine Ahnung warum?

    Fred.

     

    PS.

    Der komplette Request:

            private void btnAbfrage_Click(object sender, RoutedEventArgs e)
            {
                var url = "http://localhost/VVmobile/datenXML.php";
    
                // Create the web request object 
                HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
                webRequest.Method = "POST";
                webRequest.ContentType = "application/x-www-form-urlencoded";
    
                // Start the request 
                webRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest);
            }
    
            /// <summary>
            /// Datenübergabe
            /// </summary>
            /// <param name="asynchronousResult"></param>
            void GetRequestStreamCallback(IAsyncResult asynchronousResult)
            {
                HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
                // End the stream request operation 
                Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);
    
                // Create the post data 
                // string postData = "SQL=SELECT Kontierung as KONTIERUNG, CONCAT(Straße, ' ', Nr, ' (', Lage, ')') as STRASSE FROM haus_view LIMIT 0,10";
                string postData = "";
    
                byte[] byteArray = Encoding.UTF8.GetBytes(postData);
    
                // Add the post data to the web request 
                postStream.Write(byteArray, 0, byteArray.Length);
                postStream.Close();
    
                // Start des web request 
                webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
            }
    
    
            void GetResponseCallback(IAsyncResult asynchronousResult)
            {
                try
                {
                    HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
                    HttpWebResponse response;
    
                    // Abschliessen des Requests 
                    response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
                    Stream streamResponse = response.GetResponseStream();
                    StreamReader streamReader = new StreamReader(streamResponse);
                    string zXML = streamReader.ReadToEnd();
                    streamResponse.Close();
                    streamReader.Close();
                    response.Close();
                    MessageBox.Show(zXML);
                }
                catch (WebException e)
                {
                    MessageBox.Show(e.Message);  // Fehler
                }
            }
    



     

    Donnerstag, 19. Januar 2012 17:06

Antworten

Alle Antworten

  • Hi,

    ein asynchroner Aufruf resultiert darin, dass das Ergebnis in einem anderen Thread ausgeführt wird, als auf dem Hauptthread. Letzterer ist jedoch für das Zeichnen der Oberfläche zuständig. Der andere Thread hat jedoch so keinen Zugriff darauf.

     

    Schau dir mal diesen Artikel dazu an: http://www.silverlightshow.net/items/Tip-Asynchronous-Silverlight-Execute-on-the-UI-thread.aspx

     

    Gruß, Peter


    This posting is provided "AS IS" with no warranties, and confers no rights.
    • Als Antwort markiert perlfred Freitag, 20. Januar 2012 10:18
    Donnerstag, 19. Januar 2012 17:33
  • Hallo Peter!

    Seperater Thread! Na klar. Sagt ja schon die Fehlermeldung. Sorry.

    Ich habe jetzt von dem GetResponseCallback-Thread ein neuen Thread gestartet, welcher die Daten an den GUI-Thread übergibt.

     <pre>                streamResponse.Close();
                    streamReader.Close();
                    response.Close();
                    <span style="color:green">// Thread zur Übergabe des Ergebnis zum HauptThread (GUI) erstellen</span>
                    ThreadStart start = <span style="color:blue">delegate</span>() { Dispatcher.BeginInvoke(<span style="color:blue">new</span> Action<<span style="color:blue">string</span>>(SetXMLGUI), zXML);}; <span style="color:green">// Delegaten definieren</span>
                    <span style="color:blue">new</span> Thread(start).Start();      <span style="color:green">// Übergabe-Thread starten</span>
    
    
    
         
    <span style="color:blue">void</span> SetXMLGUI(<span style="color:blue">string</span> uzXML) {<strong> tbAbfrage.Text = uzXML</strong>; }     // Delegate-Funktion
    
    

    Ob das die eleganteste Lösung ist, weis ich nicht, aber bei dem Aufruf des GetResponseCallback-Threads habe ich die Delegate-Funktion nicht zuordnen können.

    Nochmal vielen Dank für deinen Hinweis!

    Fred.
     

    Freitag, 20. Januar 2012 10:40