1

Ich versuche, die Web-API-Methode zum Speichern der Dateidaten aufzurufen.Wenn ich Webapi-Methode debuggen fand ich, dass ContentLength nicht als richtig kommt, aus diesem Grund, wenn ich die Datei abrufen, zeigt es Fehler als beschädigte Datei.Wie übermittele ich die Dateidaten von der C# -Konsolenanwendung an WebApi?

meine Klasse Methode ist: -

using (var formData = new MultipartFormDataContent()) 
    { 
    HttpContent stringContent = new StringContent(file); 
     formData.Add(stringContent, "file", file); 
     formData.Add(new StringContent(JsonConvert.SerializeObject(file.Length)), "ContentLength "); 
     HttpResponseMessage responseFile = client.PostAsync("Report/SaveFile?docId=" + docId, formData).Result; 
    } 

My Web api Methode ist: -

[HttpPost] 
     public HttpResponseMessage SaveFile(long docId) 
     { 
      HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Unauthorized); 
      try 
      { 
       var httpRequest = HttpContext.Current.Request; 
       bool IsSuccess = true; 
       if (httpRequest.Files.Count > 0) 
       { 
        var docfiles = new List<string>(); 
        foreach (string file in httpRequest.Files) 
        { 
         HttpPostedFile postedFile = httpRequest.Files[file]; 
         // Initialize the stream. 
         Stream myStream = postedFile.InputStream; 
         myStream.Position = 0; 
         myStream.Seek(0, SeekOrigin.Begin); 
         var _item = CorrectedReportLibrary.Services.ReportService.SaveFile(myStream,docId); 
         response = Request.CreateResponse<bool>((IsSuccess) 
                     ? HttpStatusCode.OK 
                     : HttpStatusCode.NoContent, 
                    IsSuccess); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Theranos.Common.Library.Util.LogManager.AddLog(ex, "Error in CorrectedReportAPI.Controllers.SaveDocument()", null); 
       return Request.CreateResponse<ReportDocumentResult>(HttpStatusCode.InternalServerError, null); 

      } 
      return response; 
     } 

Wie kann ich die ContentLength von C# Klassenmethode eingestellt?

Antwort

0

Es sieht etwas komisch aus, dass Sie ContentLength als zweiten Parameter in der Klasse StringContent verwenden. Es wird angenommen, dass es sich um die Codierung handelt, die Sie verwenden möchten, zum Beispiel new StringContent(content, Encoding.UTF8). Ich glaube nicht, dass hier die inhaltliche Länge das Thema ist.

StringContent class

ich da es erraten ist eine Datei, die Sie hochladen möchten, haben Sie bereits die Datei als Stream gelesen, so dass ich in der Regel etwas tun, wie folgt aus:

Auftraggeber:

private async Task UploadFile(MemoryStream file) 
{ 
    var client = new HttpClient(); 
    var content = new MultipartFormDataContent(); 
    content.Add(new StreamContent(file)); 
    var result = await client.PostAsync("Report/SaveFile?docId=" + docId, content); 
} 

Bearbeiten. Da es sich um eine Multipartform handelt, ist es einfacher, das Framework mit den Details umgehen zu lassen. so etwas wie dies versucht:

Server:

[HttpPost] 
public async Task<HttpResponseMessage> SaveFile(long docId) 
{ 
    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Unauthorized); 
    try 
    { 
     var filedata = await Request.Content.ReadAsMultipartAsync(new MultipartMemoryStreamProvider()); 
     foreach(var file in filedata.Contents) 
     { 
      var fileStream = await file.ReadAsStreamAsync(); 
     } 

     response = Request.CreateResponse<bool>(HttpStatusCode.OK, true); 
    } 
    catch (Exception ex) 
    { 
     response = Request.CreateResponse<bool>(HttpStatusCode.InternalServerError, false); 
    } 
    return response; 
} 
+0

Below-Code ich habe, wie Sie gesagt, aber immer noch gleiche Problem kommt, dass ids Datei beschädigt ist ed: contents.Add (neuer StreamContent (stre), "Datei", Datei); var result = erwarten client.PostAsync ("ReportInfo/SaveFile? DocId =" + docId, Inhalt); – jack123

+0

@gorakh Mit serverseitigem Beispiel aktualisiert – Hypnobrew

0

ich endlich die Lösung keine Notwendigkeit, fand den Web-api-Dienst zu ändern, Problem war vom Client, wo ich direkt die Dateidaten vorging, nun die modifizierte Arbeits Code ist wie folgt: -

using (var formData = new MultipartFormDataContent()) 
{ 
    var bytes = File.ReadAllBytes(file); 
    formData.Add(new StreamContent(new MemoryStream(bytes)), "file", file); 
    HttpResponseMessage responseFile = client.PostAsync("ReportInfo/SaveFile?docId=" + docId, formData).Result; 
} 
Verwandte Themen