tag route que paginas pages net mvc for asp c# asp.net-mvc sharepoint asp.net-core microsoft-flow

c# - route - select asp-for asp-items



Cómo enviar un archivo a una aplicación ASP.NET Core (3)

En lugar de tener el parámetro List<IFormFile> , acceda a la propiedad Files en HttpContext.Request .

Tengo una aplicación ASP.NET que presenta un formulario simple para cargar archivos (imágenes). Eso se ve así:

public IActionResult Process() { return View(); } [HttpPost] public IActionResult Process(List<IFormFile> files) { var telemetry = new TelemetryClient(); try { var result = files.Count + " file(s) processed " + Environment.NewLine; foreach (var file in files) { result += file.FileName + Environment.NewLine; var memoryStream = new MemoryStream(); file.CopyTo(memoryStream); memoryStream.Seek(0, SeekOrigin.Begin); var binaryReader = new BinaryReader(memoryStream); var bytes = binaryReader.ReadBytes((int)memoryStream.Length); var imageInformation = ImageService.ProcessImage(bytes); ImageService.SaveImage(imageInformation.Result, bytes, file.FileName.Substring(file.FileName.LastIndexOf(".", StringComparison.Ordinal) + 1)); } return View((object)result); } catch (Exception ex) { telemetry.TrackException(ex); throw; } }

Esta forma en la aplicación funciona bien. El problema es que quiero usar Microsoft Flow para enviar los archivos que ingresan a una biblioteca de SharePoint a la aplicación web definida anteriormente.

Tengo la configuración del flujo de archivos y se ejecuta y no genera errores, pero cuando miro el cuerpo del resultado de la acción HTTP dice 0 archivos procesados ​​y no se hace nada.

El flujo que tengo configurado es

  1. Cuando se crea un archivo (SharePoint) (esto apunta a una biblioteca de documentos específica
  2. Http (Http), Método: Publicar, Uri (apuntando a mi aplicación), Cuerpo: Contenido de archivo del paso anterior de SharePoint.

Como mencioné, esto es publicar en el sitio, pero no debe pasar el archivo de una manera que el método ASP.NET pueda manejar, por lo que no está procesando nada. ¿Cómo puedo cambiar el flujo o el método Post para que funcione?

Actualizado con nueva información. He intentado esto con una imagen muy pequeña, así puedo obtener información adicional de Solicitud. Utilizando el formulario en el navegador, probé esto y pasé al siguiente resultado Request Raw usando Fiddler:

POST https://os-gbsphotoretain.azurewebsites.net/Image/Process HTTP/1.1 Host: os-gbsphotoretain.azurewebsites.net Connection: keep-alive Content-Length: 924 Pragma: no-cache Cache-Control: no-cache Origin: https://os-gbsphotoretain.azurewebsites.net Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.90 Safari/537.36 Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySjQVgrsvAqJYXmST Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 Referer: https://os-gbsphotoretain.azurewebsites.net/Image/Process Accept-Encoding: gzip, deflate, br Accept-Language: en-US,en;q=0.8 Cookie: _ga=GA1.3.955734319.1501514097; ai_user=UkqSf|2017-07-31T15:17:38.409Z; ARRAffinity=1628d46398b292eb2e3ba76b4b0f1eb1e30abd9bd1036d7a90b9c51f7baa2306; ai_session=/fPFh|1502738361594.15|1502738361594.15 ------WebKitFormBoundarySjQVgrsvAqJYXmST Content-Disposition: form-data; name="files"; filename="printer.jpg" Content-Type: image/jpeg JFIF ` ` C $.'' ",#(7),01444''9=82<.342 C 2!!22222222222222222222222222222222222222222222222222 " } !1AQa "q2 #B R $3br %&''()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w !1AQ aq"2 B #3R br $4 % &''()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ? +X K 21 c Z ] ӥg v ; : P I f > m;] ֬u nm ` Q 1 P6 s 9 |b r| G ------WebKitFormBoundarySjQVgrsvAqJYXmST--

Al hacer la misma imagen a través del flujo obtengo lo siguiente como cuerpo en flujo:

{ "$content-type": "image/jpeg", "$content": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1C9EMuqzGK1juS+3P7rccgc4yMYxjv1q/ol0I4bfTpQVniXaoyDuQHjoTg7ccGsDU7O+0+xEdoJfMUKiKE84MB/dJ5B9mzj6VneFtO1271qx1G+hubaGBjmCSUfMSMZZQNoxzgDnPfGKqcnypEJW1R//Z" }

Entonces parece que el flujo se envía como JSON. Voy a intentar un procesamiento adicional ahora como prueba, pero si alguien sabe lo que puedo poner en la aplicación web para manejar esto, lo agradecería mucho.

Agregué un nuevo método, ver debajo que funciona cuando lo ejecuto localmente pasando la cadena que Flow dice que es el cuerpo. Pero cuando lo ejecuto desde el flujo obtengo el valor no puede ser un error nulo en la línea DeserializeObject. ¿Cómo puedo obtener la información que Flow está transmitiendo?

[HttpPost] public IActionResult ProcessJson(string json) { var telemetry = new TelemetryClient(); try { var result = "JSON processed " + Environment.NewLine; var details = (dynamic)Newtonsoft.Json.JsonConvert.DeserializeObject(json); var content = (string) details["$content"]; var bytes = Convert.FromBase64String(content); ProcessBytes(bytes, "jpeg"); return View("Process", result); } catch (Exception ex) { telemetry.TrackException(ex); throw; } }

También probé un método con esta firma, pero no tuve suerte, o bien viene como nulo

[HttpPost] public IActionResult ProcessJson([FromBody]FlowFile file) { ... } public class FlowFile { [JsonProperty(PropertyName = "$content-type")] public string ContentType { get; set; } [JsonProperty(PropertyName = "$content")] public string Content { get; set; } }

Agregué un poco de middleware, para poder obtener el Request.Body crudo y el resultado final que proviene de eso es esto. No estoy seguro de lo que esto significa.

&#xD;&#xA;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#x10;JFIF&#x0;&#x1;&#x1;&#x1;&#x0;`&#x0;`&#x0;&#x0;&#xFFFD;&#xFFFD;&#x0;C&#x0;&#x8;&#x6;&#x6;&#x7;&#x6;&#x5;&#x8;&#x7;&#x7;&#x7;&#x9;&#x9;&#x8;&#xA;&#xC;&#x14;&#xD;&#xC;&#xB;&#xB;&#xC;&#x19;&#x12;&#x13;&#xF;&#x14;&#x1D;&#x1A;&#x1F;&#x1E;&#x1D;&#x1A;&#x1C;&#x1C; $.&#x27; &quot;,#&#x1C;&#x1C;(7),01444&#x1F;&#x27;9=82&lt;.342&#xFFFD;&#xFFFD;&#x0;C&#x1;&#x9;&#x9;&#x9;&#xC;&#xB;&#xC;&#x18;&#xD;&#xD;&#x18;2!&#x1C;!22222222222222222222222222222222222222222222222222&#xFFFD;&#xFFFD;&#x0;&#x11;&#x8;&#x0;&#x10;&#x0;&#x10;&#x3;&#x1;&quot;&#x0;&#x2;&#x11;&#x1;&#x3;&#x11;&#x1;&#xFFFD;&#xFFFD;&#x0;&#x1F;&#x0;&#x0;&#x1;&#x5;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x1;&#x2;&#x3;&#x4;&#x5;&#x6;&#x7;&#x8;&#x9;&#xA;&#xB;&#xFFFD;&#xFFFD;&#x0;&#xFFFD;&#x10;&#x0;&#x2;&#x1;&#x3;&#x3;&#x2;&#x4;&#x3;&#x5;&#x5;&#x4;&#x4;&#x0;&#x0;&#x1;}&#x1;&#x2;&#x3;&#x0;&#x4;&#x11;&#x5;&#x12;!1A&#x6;&#x13;Qa&#x7;&quot;q&#x14;2&#xFFFD;&#xFFFD;&#xFFFD;&#x8;#B&#xFFFD;&#xFFFD;&#x15;R&#xFFFD;&#xFFFD;$3br&#xFFFD;&#x9;&#xA;&#x16;&#x17;&#x18;&#x19;&#x1A;%&amp;&#x27;()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#x1F;&#x1;&#x0;&#x3;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x1;&#x0;&#x0;&#x0;&#x0;&#x0;&#x0;&#x1;&#x2;&#x3;&#x4;&#x5;&#x6;&#x7;&#x8;&#x9;&#xA;&#xB;&#xFFFD;&#xFFFD;&#x0;&#xFFFD;&#x11;&#x0;&#x2;&#x1;&#x2;&#x4;&#x4;&#x3;&#x4;&#x7;&#x5;&#x4;&#x4;&#x0;&#x1;&#x2;w&#x0;&#x1;&#x2;&#x3;&#x11;&#x4;&#x5;!1&#x6;&#x12;AQ&#x7;aq&#x13;&quot;2&#xFFFD;&#x8;&#x14;B&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x9;#3R&#xFFFD;&#x15;br&#xFFFD;&#xA;&#x16;$4&#xFFFD;%&#xFFFD;&#x17;&#x18;&#x19;&#x1A;&amp;&#x27;()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x0;&#xC;&#x3;&#x1;&#x0;&#x2;&#x11;&#x3;&#x11;&#x0;?&#x0;&#xFFFD;&#xB;&#xFFFD;&#xC;&#xFFFD;&#xFFFD;&#xFFFD;&#x2B;X&#xFFFD;K&#xFFFD;&#xFFFD;&#xFFFD;&#x1C;&#xFFFD;&#xFFFD;21&#xFFFD;c&#xFFFD;Z&#xFFFD;&#xFFFD;]&#x8;&#xFFFD;&#x4E5;&#x5;g&#xFFFD;v&#xFFFD;&#xFFFD;;&#xFFFD;&#x1E;:&#x13;&#xFFFD;&#xFFFD;&#x1C;&#x1A;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#xFFFD;&#x11;&#x1D;&#xFFFD;&#xFFFD;&#xFFFD;P&#xFFFD;&#xFFFD;&#x13;&#xFFFD;&#xC;&#x7;&#xFFFD;I&#xFFFD;&#x1F;f&#xFFFD;&gt;&#xFFFD;&#xFFFD;&#xFFFD;m;]&#xFFFD;&#x5AC;u&#x1B;&#xFFFD;nm&#xFFFD;&#xFFFD;&#xFFFD;`&#xFFFD;Q&#xFFFD;&#x12;1&#xFFFD;P6&#xFFFD;s&#xFFFD;9&#xFFFD;|b&#xFFFD;r|&#xFFFD;&#x10;&#xFFFD;&#xFFFD;G&#xFFFD;


Bueno, no me queda claro cómo se envía exactamente el archivo: ¿se trata de un objeto json donde el archivo se convierte previamente como serie base64 o es un contenido de archivo? (los encabezados html son los indicadores)

Si tienes una teoría json, podrías hacer:

var parsedFileContent = Newtonsoft.Json.JsonConvert.DeserializeObject<FlowFile>(json);

en lugar de

var details = (dynamic)Newtonsoft.Json.JsonConvert.DeserializeObject(json);

y debería funcionar, si y solo si;), lo que publicaste es correcto

{ "$content-type": "image/jpeg", "$content": "/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAQABADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD1C9EMuqzGK1juS+3P7rccgc4yMYxjv1q/ol0I4bfTpQVniXaoyDuQHjoTg7ccGsDU7O+0+xEdoJfMUKiKE84MB/dJ5B9mzj6VneFtO1271qx1G+hubaGBjmCSUfMSMZZQNoxzgDnPfGKqcnypEJW1R//Z" }

solo asegúrate de que el json esté en una sola línea (asegúrate de que no haya caracteres ocultos como / n o similares)

Por otro lado, en tu captura Fidler tienes:

Content-Type: multipart / form-data;

Así que la forma correcta de hacerlo es con IFormFile

Entonces la información provista es un poco engañosa. ¿Puedes probar y pasar una tirada más grande de los registros de errores? "referencia de objeto no enviada a una instancia de un error de objeto" es muy general y generalmente ese tipo de errores se reducen con el rastreo de la pila.


Finalmente conseguí este trabajo. Lo que tenía que hacer era leer el flujo de solicitud sin procesar directamente y esa transmisión era solo la imagen. Todo lo que Flow decía sobre enviar la imagen en una cadena JSON codificada en Base64 no era correcta. No pude hacer que se vincule a ningún parámetro ni a Request.Form.Files, pero pude leer la transmisión directamente y guardar la imagen directamente desde allí.