2016-06-21 5 views
1

Ich habe ein großes Problem mit diesem Code Ich versuche, einfach eine Liste der Adresse von craftycllick Server herunterladen, die xml basiert Ich verwende Webclient, um den Download zu tun, aber es ist andernfalls noch, wenn ich an den Browser gehen die DatenWebClient-Download von Anwendungsdaten, die Ergebnis nicht in Leser zurückgeben

public XmlTextReader readXML(string postcode, string response, string accessCode) 
{ 
     //Create URL 
     string url = $"http://pcls1.craftyclicks.co.uk/xml/rapidaddress?postcode={postcode}&response={response}&key={accessCode}"; 

     try 
     { 
      //Create WebRequest 
      WebRequest request = WebRequest.Create(url); 
      using (Stream responseStream = request.GetResponse().GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (TextReader textReader = new StreamReader(responseStream)) 
        { 
         XmlTextReader reader = new XmlTextReader(textReader); 
         Debug.Assert(reader != null, "Reader is NULL"); 
         return reader; 
        } 
       } 
       throw new Exception("ResponseStream is NULL"); 
      } 
     } 
     catch (WebException ex) 
     { 
      return null; 
     } 
} 

Xml, die zurückgegeben wird, ist

<CraftyResponse><address_data_formatted><delivery_point><organisation_name>THE BAKERY</organisation_name><department_name/><line_1>1 HIGH STREET</line_1><line_2>CRAFTY VALLEY</line_2><udprn>12345678</udprn></delivery_point><delivery_point><organisation_name>FILMS R US</organisation_name><department_name/><line_1>3 HIGH STREET</line_1><line_2>CRAFTY VALLEY</line_2><udprn>12345679</udprn></delivery_point><delivery_point><organisation_name>FAMILY BUTCHER</organisation_name><department_name/><line_1>7 HIGH STREET</line_1><line_2>CRAFTY VALLEY</line_2><udprn>12345680</udprn></delivery_point><delivery_point><organisation_name/><department_name/><line_1>BIG HOUSE, HIGH STREET</line_1><line_2>CRAFTY VALLEY</line_2><udprn>12345681</udprn></delivery_point><delivery_point><organisation_name/><department_name/><line_1>LITTLE COTTAGE</line_1><line_2>17 HIGH STREET, CRAFTY VALLEY</line_2><udprn>12345682</udprn></delivery_point><delivery_point_count>5</delivery_point_count><town>BIG CITY</town><postal_county>POSTAL COUNTY</postal_county><traditional_county>TRADITIONAL COUNTY</traditional_county><postcode>AA1 1AA</postcode></address_data_formatted></CraftyResponse> 

Und die Routine ich Parse verwenden.

public DataTable returnAddressList(string postcode, string accessCode) 
    { 
     try 
     { 
      DataTable dtReturn = new DataTable(); 
      dtReturn.Columns.Add("PropertyItem", Type.GetType("System.String")); 
      dtReturn.Columns.Add("PropertyValue", Type.GetType("System.String")); 

      postcode = postcode.Replace(" ", ""); 
      XmlTextReader reader = readXML(postcode, "data_formatted", accessCode); 

      string option1 = ""; 
      string option2 = ""; 

      while (reader.Read()) 
      { 

       if (reader.Name.Equals("line_1")) 
       { 
        option1 = reader.ReadString(); 
       } 
       if (reader.Name.Equals("udprn")) 
       { 
        option2 = reader.ReadString(); 
       } 
       if (option1 != "" && option2 != "") 
       { 
        dtReturn.Rows.Add(new object[] { option1, option2 }); 
        option1 = ""; 
        option2 = ""; 
       } 
      } 

      return dtReturn; 
     } 

     catch (Exception ex) 
     { 
      return null; 
     } 
    } 

Und My Calling Code der obigen Funktion ist

fhsBl.Helpers.CraftyPostCodeLookup _postCodeLookup = new fhsBl.Helpers.CraftyPostCodeLookup(); 

     DataTable dt = new DataTable(); 

     dt = _postCodeLookup.returnAddressList("AA11AA", "API KEY DONT BE NOSY"); 

Edit 1 Ok beriet ich meinen Code geändert, um die Verwendung von statment zu verwenden und den Inhalt in das lesen, aber ich bin immer ein weiterer Fehler und immer noch keine Datenproduktion.

public DataTable readXML(string postcode, string response, string accessCode) 
    { 
     //Create URL 
     string url = $"http://pcls1.craftyclicks.co.uk/xml/rapidaddress?postcode={postcode}&response={response}&key={accessCode}"; 

     try 
     { 
      DataTable dtReturn = new DataTable(); 
      dtReturn.Columns.Add("PropertyItem", Type.GetType("System.String")); 
      dtReturn.Columns.Add("PropertyValue", Type.GetType("System.String")); 

      //Create WebRequest 
      WebRequest request = WebRequest.Create(url); 
      using (Stream responseStream = request.GetResponse().GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (TextReader textReader = new StreamReader(responseStream)) 
        { 
         XmlTextReader reader = new XmlTextReader(textReader); 
         postcode = postcode.Replace(" ", ""); 

         string option1 = ""; 
         string option2 = ""; 

         while (reader.Read()) 
         { 

          if (reader.Name.Equals("line_1")) 
          { 
           option1 = reader.ReadString(); 
          } 
          if (reader.Name.Equals("udprn")) 
          { 
           option2 = reader.ReadString(); 
          } 
          if (option1 != "" && option2 != "") 
          { 
           dtReturn.Rows.Add(new object[] { option1, option2 }); 
           option1 = ""; 
           option2 = ""; 
          } 
         } 
         return dtReturn; 
        } 
       } 
       throw new Exception("ResponseStream is NULL"); 
      } 
     } 
     catch (WebException ex) 
     { 
      return null; 
     } 
    } 

Screenshot der Fehlersuche

enter image description here

+0

Vielen Dank für die Abstimmung bis – rogue39nin

+0

Was ziehen? Gibt es eine Ausnahme? – pijemcolu

+0

@pijemcolu Ich schaue tatsächlich auf den Stack-Trace und sein Sprichwort kann nicht aus einem geschlossenen Text-Stream lesen, wenn das machen, da das innerhalb der Fang ist versuchen Element von returnAddressList – rogue39nin

Antwort

1

Wie die Diskussion in den Kommentaren ging ...

using (TextReader textReader = new StreamReader(responseStream)) 
       { 
        XmlTextReader reader = new XmlTextReader(textReader); 
        Debug.Assert(reader != null, "Reader is NULL"); 
        return reader; 
       } 

Sie erstellen ein Objekt Textreader, die Sie später im Konstruktor fo XmlTextReader Leser verwenden ... nachdem Sie XmlTextReader zurückkehren und, wenn Sie die Verwendung von Block verlassen Sie entsorgen und schließen den TextReader, daher der Fehler, den Sie nicht aus einem geschlossenen TextReader lesen können. Das Problem liegt in der Architektur imo.

Sie versuchen sollten, andernfalls die die while-Schleife Logik von der Parse-Methode Sie haben in den der mit Block wie ....

using(TextReader textReader = new StreamReader(responseStream)) 
     { 
      XmlTextReader reader = new XmlTextReader(textReader); 

      while(reader.Read()) 
      { 
       if(reader.Name.Equals("line_1")) 
       { 
        option1 = reader.ReadString(); 
       } 
       if(reader.Name.Equals("udprn")) 
       { 
        option2 = reader.ReadString(); 
       } 
       if(option1 != "" && option2 != "") 
       { 
        dtReturn.Rows.Add(new object[] { option1, option2 }); 
        option1 = ""; 
        option2 = ""; 
       } 
      } 
     } 
0

OK. Sie können nicht von using statment zurückkehren, wenn Sie den Stream zurückgeben möchten, denn wenn Sie von using beenden, rufen Sie Dispose Methode auf und schließen Sie den Stream.

Zuerst müssen Sie readXML Methode ändern.

public DataTable readXML(string postcode, string response, string accessCode) 
{ 
     //Create URL 
     string url = $"http://pcls1.craftyclicks.co.uk/xml/rapidaddress?postcode={postcode}&response={response}&key={accessCode}"; 

     DataTable dataTableResult = null; 

     try 
      //Create WebRequest 
      WebRequest request = WebRequest.Create(url); 
      using (Stream responseStream = request.GetResponse().GetResponseStream()) 
      { 
       if (responseStream != null) 
       { 
        using (TextReader textReader = new StreamReader(responseStream)) 
        { 
         XmlTextReader reader = new XmlTextReader(textReader); 
         Debug.Assert(reader != null, "Reader is NULL"); 

         dataTableResult = returnAddressList(postcode, response, reader) 
        } 
       } 
       throw new Exception("ResponseStream is NULL"); 
      } 

      return dataTableResult; 
     } 
     catch (WebException ex) 
     { 
      return null; 
     } 

Und nächst Sie Definition returnAddressList Methode ändern müssen, wie dieser Strom aus dem Parameter zu verwenden:

public DataTable returnAddressList(string postcode, string accessCode, XmlTextReader reader) 

und gelöschte Zeile, wo Sie readXML Methode aufrufe

XmlTextReader reader = readXML(postcode, "data_formatted", accessCode); - delete this line 

Es ist nicht sehr gutes Refactoring, aber Sie können sehen, was zu tun ist und wo das Problem ist.

+0

Bitte beachten Sie meine erste Bearbeitung bitte – rogue39nin

+0

OK, aber Ihre screeanshot in nicht wirklich hilfreich Geben Sie uns etwas besser wie lins whre Problem erscheint nad Text des Fehlers –

+0

I thing das ist ein Problem mit 'Reader .ReadString(); ' –

Verwandte Themen