Buenas a todos:
Necesito que me echéis un cable, aunque sea al cuello.
Antecedentes
Estoy cambiando el motor de una WebApi, que antes usaba una API a través de la típica dll, con sus funciones, variables... todo muy C.
Pero los tiempos cambian y ahora nos "obligan" a utilizar una API web, en que las peticiones se hacen mediante HTTP y comandos GET, POST o PU... PATCH.
Los comandos más sencillos (el 80% de la API) no he tenido problemas: tengo una instancia HttpClient, que contiene los datos de logeo en el sistema, y es lo que uso, junto a JsonConvert.Serialize (para convertir clases en datos y datos en clases) para hacer mis peticiones.
Pero ahora resulta que tengo que anexar documentos, y la API trae una función sencilla para hacerlo de forma local, y un galimatías para hacerlo de forma remota.
Con la forma sencilla creo un objeto "attachment" en la BBDD que puedo anexar a cualquier documento, y funciona aunque la API web esté en otra máquina... pero el fichero no se copia a la carpeta donde debería guardarse de forma automática, junto a todos los anexos.
El problema
Según la documentación, para poder hacer el anexo correctamente, debo hacer una petición multiparte, que tenga el siguiente aspecto:
Código:
POST /b1s/v1/Attachments2 HTTP/1.1
Content-Type: multipart/form-data; boundary=myBoundary
--myBoundary
Content-Disposition: form-data; name="files"; filename="image1.jpg"
Content-Type: image/jpeg
<image binary data>
--myBoundary
Content-Disposition: form-data; name="files"; filename="image2.jpg"
Content-Type: image/jpeg
<image binary data>
--myBoundary--
El problema es que no sé traducir todo eso a comandos de la librería .Net.Http. Todos mis intentos me han producido una respuesta 405 (Method not allowed), pero si profundizo en el error, hay un error "250: Bad post content" por ahí dentro. Lo he intentado incluso con ChatGPT, pero hasta él se lía mezclando el HttpContent con un MultipartContent.
Soy tan inútil, que no sé qué significa "<image binary data>"... Sí, sé que es el contenido del fichero, pero no sé a qué lo tengo que convertir para ponerlo ahí, ni cómo incrustarlo.
Lo más limpio que tengo hecho sería esto:
Código:
public static async Task<HttpResponseMessage> AddNetAttachmentList (HttpClient client, List<string> fileList)
{
HttpRequestMessage request;
HttpResponseMessage response = null;
MultipartFormDataContent mpContent;
StringContent content;
string boundary;
string tempString;
byte[] fileContent;
JsonSerializerSettings serializeSettings = new Newtonsoft.Json.JsonSerializerSettings()
{
NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore,
//DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Ignore,
//Culture = new System.Globalization.CultureInfo("en-US")
};
//Creando petición multipart
boundary = "Attachments2_AddList";
mpContent = new MultipartFormDataContent(boundary);
for (int i = 0; i < fileList.Count; i++)
{
fileContent = File.ReadAllBytes(fileList[i]);
//var fileContentStream = new MemoryStream(fileContent);
//var fileContentStreamContent = new StreamContent(fileContentStream);
var fileContentStreamContent = new ByteArrayContent(fileContent);
switch (Path.GetExtension(fileList[i]))
{
case ".jpg":
fileContentStreamContent.Headers.Add("Content-Type","image/jpeg");
mpContent.Add(fileContentStreamContent, "files", Path.GetFileName(fileList[i]));
break;
case ".pdf":
//fileContent = File.ReadAllBytes(fileList[i]);
//content = new ByteArrayContent(fileContent);
//content.Headers.ContentDisposition = new ContentDispositionHeaderValue(string.Format("form-data; name=\"files\"; filename=\"{0}\"", fileList[i]));
//content.Headers.ContentType = new MediaTypeHeaderValue("application/pdf");
break;
default:
fileContentStreamContent.Headers.Add("Content-Type", "application/octet-stream");
mpContent.Add(fileContentStreamContent, "files", Path.GetFileName(fileList[i]));
break;
}
}
response = client.PostAsync("Attachments2", mpContent).Result;
return response;
Obviamente he quitado mucha paja por en medio (gestión de errores, líneas de debug, etc...), y lo he intentado de un par de formas más, pero no consigo el resultado esperado.
¿Alguien me puede ayudar? Si no puede ser en C#, en algo que sea lo más parecido posible.
Gracias.
Marcadores