2

ファイル データを保存するために Web API メソッドを呼び出そうとしています。

私のクラスメソッドは:-

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

私のWeb APIメソッドは次のとおりです:-

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

ContentLengthfrom C# クラス メソッドを設定するにはどうすればよいですか?

4

2 に答える 2

0

ContentLengthクラスの 2 番目のパラメーターとして使用するのは少し奇妙に見えますStringContent。たとえば、使用するエンコーディングであると想定されます new StringContent(content, Encoding.UTF8)。ここで問題になるのはコンテンツの長さではないと思います。

StringContent クラス

アップロードしたいファイルなので、すでにファイルをストリームとして読み取っているので、通常は次のようにします。

クライアント:

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

編集。マルチパートフォームであるため、フレームワークに詳細を処理させる方が簡単です。次のようなことを試してください:

サーバ:

[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;
}
于 2016-12-05T09:11:54.193 に答える