2012-04-05 5 views
2

Ich konvertiere ein Bild in base64 Zeichenfolge zum Hochladen über HttpWebRequest in C# .auf Server-Seite, wenn ich Base64 Zeichenfolge die Zeichen "+" erhalten haben in weiß konvertiert Leerzeichen "". Es gibt mir Fehler, diese Base64-Zeichenfolge in Byte-Array zu konvertieren.Ich möchte keine Änderungen auf der Serverseite vornehmen (in Web-Services). Ich möchte diese Probleme auf der Clientseite beheben. Mein clientseitiger Code ist wie folgt.sendende Base64-Zeichenfolge mit HttpWebRequest in C# konvertieren "+" in Leerraum Problem

//////////////////

WSManagerResult wsResult = new WSManagerResult();

 try 
     { 
      HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(serviceURL); 
      req.Method = "POST"; 
      req.ProtocolVersion = HttpVersion.Version11; 
      req.ContentType = "application/x-www-form-urlencoded"; 
      // req.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; 
      // req.CookieContainer = new CookieContainer(); 


      string content = string.Empty; 
      foreach (KeyValuePair<string, string> entry in paramDic) 
      { 

// entry.Value ist ein Gen Basis 64 String bewertet von Bild

   content = content + entry.Key + "=" + entry.Value + "&&"; 
      } 
      content = content.TrimEnd('&'); // input parameter if u have more that one //a=b&dd=aa    
      req.ContentLength = content.Length; 
      // req = URLEncode(content); 
      Stream wri = req.GetRequestStream(); 


      byte[] array = Encoding.ASCII.GetBytes(content); 
      if (array.Length > 0) 
       wri.Write(array, 0, array.Length); 
      wri.Flush(); 
      wri.Close(); 
      WebResponse rsp = (HttpWebResponse)req.GetResponse(); 


      byte[] b = null; 
      using (Stream stream = rsp.GetResponseStream()) 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       int count = 0; 
       do 
       { 
        byte[] buf = new byte[1024]; 
        count = stream.Read(buf, 0, 1024); 
        ms.Write(buf, 0, count); 
       } while (stream.CanRead && count > 0); 
       b = ms.ToArray(); 
      } 
      wsResult.result = Encoding.ASCII.GetString(b); 
     } 
     catch (Exception e) 
     { 
      clsException.ExceptionInstance.HandleException(e); 
      wsResult.error = e.Message; 
     } 


     return wsResult; 

die "+" Alle Zeichen in über base64 String umgewandelt werden in auf "" weiß spaces.which die Ursachen Problem wie oben beschrieben.

Bitte helfen Sie mir, dieses Problem zu lösen.

Grüße

Schah Khalid

+1

Ich versuche immer, meine Frage (Code/Eingabe) zu minimieren, bevor Sie fragen ... Jetzt merke ich, es ist sehr wichtig und gute Praxis. –

Antwort

2

Es existiert eine Codierung für nur, dass entworfen heißt Base64Url encode die. Allerdings müssen Sie möglicherweise die Codierung/Decodierung an ihren jeweiligen Enden tun.

In Base64 Url, es wandelt +-- und / zu _, so dass sie sicher über den Draht ohne den Standard-URL-Encoder übergeben werden, indem Seltsamkeit wie Leerzeichen oder Prozent-hex

+0

Vielen Dank. Rob.it hat mein Problem gelöst, indem auf der Client-Seite das hexadezimale '% 2B' durch '+' ersetzt wurde, um die Daten über die Leitung zu übermitteln. Siehe unten in C#./* Die Verwendung von Standard Base64 in URL erfordert die Codierung von '+', '/' und '=' Zeichen in spezielle prozentcodierte hexadezimale Sequenzen ('+' = '% 2B', '/' = '% 2F' und ' = '='% 3D ') */String stbase64datatopost = stbase64datatopost.Replace ("+", @ "% 2B"); stbase64datatopost = stbase64datatopost .Replace ("/", @ "% 2F"); stbase64datatopost = stbase64datatopost.Replace ("=", @ "% 3D"); – shahkhalid

1

Versuchen Sie base64 veröffentlichen codierten Daten auf dem Web-Service mit HttpUtility.UrlEncode(entry)

Web-Service sollten in der Lage, es zu analysieren, ohne den Code

3

vielen dank Rob.it gelöst mein Problem Wechsel durch ersetzen ‚+‘, um es hexadezimal ‚% 2B‘ auf der Client-Seite p ost Daten durch Draht. wie unten in C#.

/*Using standard Base64 in URL requires encoding of '+', '/' and '=' characters into special percent-encoded hexadecimal sequences ('+' = '%2B', '/' = '%2F' and '=' = '%3D')*/ 

String stbase64datatopost =stbase64datatopost.Replace("+",@"%2B"); 
stbase64datatopost = stbase64datatopost .Replace("/",@"%2F");  
stbase64datatopost=stbase64datatopost.Replace("=",@"%3D"); 
+0

Das hat für mich funktioniert. In meinem Fall wurde das + durch ein Leerzeichen und das/oder = durch einen Wagenrücklauf ersetzt. – kannankeril