c# - viewcomponent - So senden Sie eine Datei an eine ASP.NET Core-Anwendung




razor pages (2)

List<IFormFile> die Eigenschaft Files in HttpContext.Request List<IFormFile> Parameter List<IFormFile> HttpContext.Request .

Ich habe eine ASP.NET-Anwendung, die ein einfaches Formular zum Hochladen von Dateien (Bildern) darstellt. Das sieht so aus:

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;
    }
}

Dieses Formular in der Anwendung funktioniert einwandfrei. Das Problem ist, dass ich Microsoft Flow verwenden möchte, um Dateien, die in eine SharePoint-Bibliothek kommen, an die oben definierte Webanwendung zu senden.

Ich habe den Dateifluss Setup und es läuft und nicht Fehler aus, aber wenn ich auf den Körper der HTTP-Aktion Ergebnis sieht es 0 Dateien verarbeitet und nichts getan wird.

Der Flow, den ich eingerichtet habe, ist

  1. Wenn eine Datei erstellt wird (SharePoint) (dies verweist auf eine bestimmte Dokumentbibliothek)
  2. Http (Http), Methode: Post, Uri (zeigt auf meine App), Körper: Dateiinhalt aus dem SharePoint-Schritt oben.

Wie ich bereits erwähnt habe, ist dies eine Veröffentlichung auf der Website, die Datei muss jedoch nicht so übergeben werden, dass die ASP.NET-Methode verarbeitet werden kann. Daher wird nichts verarbeitet. Wie kann ich entweder die Flow- oder die Post-Methode ändern, so dass es funktioniert?

Mit neuen Informationen aktualisiert habe ich dies mit einem sehr kleinen Bild versucht, so kann ich einige zusätzliche Informationen anfordern. Mit dem Formular im Browser habe ich das versucht und das folgende Request Raw-Ergebnis mit 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--

Wenn ich dasselbe Bild durch den Fluss mache, erhalte ich Folgendes als den Körper im Fluss:

{
  "$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"
}

Es sieht also so aus, als ob der Fluss als JSON gesendet wird. Ich werde jetzt eine zusätzliche Verarbeitung als Test versuchen, aber wenn jemand weiß, was ich in die Web-App einbringen kann, würde ich das sehr schätzen.

Ich habe eine neue Methode hinzugefügt, siehe unten, die funktioniert, wenn ich sie lokal ausführe, indem ich die Zeichenfolge übergebe, die Flow sagt, dass es der Körper ist. Aber wenn ich es aus dem Fluss ausführen, kann ich in der DeserializeObject-Zeile keinen Null-Fehler erhalten. Wie kann ich die Informationen erhalten, die Flow eingibt?

[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;
        }
    }

Ich habe auch eine Methode mit dieser Signatur ausprobiert, aber kein Glück dort, entweder kommt es als Null

        [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; }
    }

Ich habe etwas Middleware hinzugefügt, so dass ich das rohe Request.Body bekommen konnte und das Endergebnis, das daraus kommt, ist dies. Ich bin mir nicht sicher, was das bedeutet.

&#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;

Nun, es ist mir ein wenig unklar, wie genau die Datei gesendet wird: Ist es ein JSON-Objekt, bei dem die Datei zuvor als Base64-String konvertiert wurde, oder handelt es sich um einen Dateiinhalt? (HTML-Header sind die Indikatoren)

Wenn Sie JSON Theorie haben, könnten Sie tun:

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

Anstatt von

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

und es sollte funktionieren, wenn und nur wenn;), was du gepostet hast ist richtig

{
  "$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"
}

Stellen Sie nur sicher, dass der JSON in einer einzelnen Zeile ist (stellen Sie sicher, dass keine versteckten Zeichen wie \ n oder ähnlich sind)

Auf der anderen Seite haben Sie in Ihrer Fidler-Aufnahme:

Content-Type: Multipart / Formulardaten;

Also der richtige Weg mit IFormFile zu gehen

Die bereitgestellten Informationen sind daher ein wenig irreführend. Können Sie versuchen, ein größeres Chuck der Fehlerprotokolle zu übergeben? "Objektreferenz nicht an eine Instanz eines Objektfehlers gesendet" ist sehr allgemein und normalerweise werden diese Arten von Fehlern bei der Stapelverfolgung eingegrenzt.





microsoft-flow