c# length - La entrada no es una cadena Base-64 válida ya que contiene un carácter no base 64




net vb (6)

Como está devolviendo una cadena como JSON, esa cadena incluirá las comillas de apertura y cierre en la respuesta sin formato. Entonces su respuesta probablemente debería verse así:

"abc123XYZ=="

o lo que sea ... Puedes intentar confirmar esto con Fiddler.

Mi suposición es que el resultado. El result.Content es la cadena en bruto, incluidas las comillas. Si ese es el caso, entonces result.Content tendrá que ser deserializado antes de poder usarlo.

Tengo un servicio REST que lee un archivo y lo envía a otra aplicación de consola luego de convertirlo a una matriz de bytes y luego a una cadena de Base64. Esta parte es correcta, pero cuando se recibe el mismo flujo en la aplicación, se manipula y ya no es una cadena Base64 válida. Algunos caracteres basura se están introduciendo en la transmisión.

La excepción que recibo al convertir la transmisión de nuevo a Byte es "La entrada no es una cadena válida Base-64, ya que contiene un carácter no base de 64, más de dos caracteres de relleno o un carácter de espacio no blanco entre el relleno personajes " .

En el servicio:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Json)]  
public string ExportToExcel()
  {
      string filetoexport = "D:\\SomeFile.xls";
      byte[] data = File.ReadAllBytes(filetoexport);
      var s = Convert.ToBase64String(data);
      return s;
  }

En la aplicación:

       var client = new RestClient("http://localhost:56877/User/");
       var request = new RestRequest("ReadFile/Convert", RestSharp.Method.GET);
       request.AddHeader("Accept", "application/Json");
       request.AddHeader("Content-Type", "application/Json");
       request.OnBeforeDeserialization = resp => {resp.ContentType =    "application/Json";};
       var result = client.Execute(request);
       byte[] d = Convert.FromBase64String(result.Content); 

Muy posiblemente se está convirtiendo en un Base64 modificado, donde los caracteres + y / se cambian a - y _ . Ver http://en.wikipedia.org/wiki/Base64#Implementations_and_history

Si ese es el caso, debe volver a cambiarlo:

string converted = base64String.Replace('-', '+');
converted = converted.Replace('_', '/');

Arreglé un contexto similar al que describiste y me enfrenté al mismo error. Logré ponerlo en funcionamiento eliminando " desde el principio hasta el final del contenido y reemplazando \/ con / .

Aquí está el fragmento de código:

var result = client.Execute(request);
var response = result.Content
    .Substring(1, result.Content.Length - 2)
    .Replace(@"\/","/");
byte[] d = Convert.FromBase64String(response);

Como alternativa, puede considerar usar XML para el formato de respuesta:

[WebGet(UriTemplate = "ReadFile/Convert", ResponseFormat = WebMessageFormat.Xml)]  
public string ExportToExcel() { //... }

En el lado del cliente:

request.AddHeader("Accept", "application/xml");
request.AddHeader("Content-Type", "application/xml");
request.OnBeforeDeserialization = resp => { resp.ContentType = "application/xml"; };

var result = client.Execute(request);
var doc = new System.Xml.XmlDocument();
doc.LoadXml(result.Content);
var xml = doc.InnerText;
byte[] d = Convert.FromBase64String(xml);

Comprueba si tus datos de imagen contienen alguna información de encabezado al principio:

imageCode = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

Esto causará el error anterior.

Simplemente elimine todo lo que está delante e incluya la primera coma, y ​​listo.

imageCode = "iVBORw0KGgoAAAANSUhEUgAAAMgAAABkC...

En caso de que no sepas el tipo de imagen cargada, solo debes quitar su encabezado base64 :

 var imageParts = model.ImageAsString.Split(',').ToList<string>();
 //Exclude the header from base64 by taking second element in List.
 byte[] Image = Convert.FromBase64String(imageParts[1]);

Necesitas los argumentos de la línea de comandos para msbuild para hacer que funcione:

msbuild.exe MyProj.proj /p:TargetFrameworkVersion=v2.0;Configuration=Release /tv:3.5

por lo tanto, anulando el valor en el archivo de proyecto, así como el ToolsVersion.

Para averiguar qué versión predeterminada de msbuild se usa, inicie un indicador de comandos de Visual Studio (que se encuentra en el menú Inicio> Microsoft Visual studio 2010> Visual Studio Tools) y escriba msbuild. La primera línea de la salida contendrá su BuidEngineversion:

Microsoft (R) Build Engine versión 4.0.30319.1

Desde el doc msdn:

MSBuild usa un conjunto de herramientas de tareas, objetivos y herramientas para construir una aplicación. Normalmente, un conjunto de herramientas de MSBuild incluye un archivo microsoft.common.tasks, un archivo microsoft.common.targets y compiladores como csc.exe y vbc.exe. La mayoría de los conjuntos de herramientas se pueden utilizar para compilar aplicaciones para más de una versión de .NET Framework y más de una plataforma de sistema

También puede consultar las variables del entorno para una versión del marco instalado: set F en el indicador de comandos de Visual Studio me da este resultado:

Framework35Version = v3.5
FrameworkDir = c: \ Windows \ Microsoft.NET \ Framework \
FrameworkDIR32 = c: \ Windows \ Microsoft.NET \ Framework \
FrameworkVersion = v4.0.30319
FrameworkVersion32 = v4.0.30319

Explicación de ToolSet
ToolSetVersion







c# file-io base64