Передайте Image в WebAPI из контроллера MVC, чтобы он был доступен в HttpContext.Current.Request.Files - PullRequest
0 голосов
/ 23 октября 2018

Я создал webApi, который ожидает данные формы.Я передаю изображение и данные в WebAPI.Когда я передаю параметры с помощью PostMan, я могу получить данные внутри модели, а файл доступен внутри HttpContext.Current.Request.Files.

Теперь я хочу передать те же данные и изображения в webapi через контроллер MVC.Данные могут получить в моем методе API, но получение файла оказывается сложной задачей.Это мой метод APi

  [Route("Profile/EditUserProfileAsync")]
    [HttpPost]
    public async Task<HttpResponseMessage> EditUserProfile(UserProfile userProfile)
    {
        try
        {

            var Identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
            int UserId = Convert.ToInt32(Identity.Claims.Where(c => c.Type == ClaimTypes.Sid).Select(c => c.Value).SingleOrDefault());
            if (UserId == 0)
            {
                return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "User Not Found!");
            }

            userProfile.UserId = UserId;
            HttpRequestMessage request = this.Request;
            if (!request.Content.IsMimeMultipartContent())
            {
                throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
            }


            var Result = await _userprofile.EditUserProfile(userProfile);
            return Request.CreateResponse(HttpStatusCode.Created, Result);
        }
        catch (Exception ex)
        {
            await _log.logError(new ErrorLog() { CreatedDate = DateTime.Now, CustomMessage = "Error in EditUserProfile API", ErrorMessage = ex.Message, ModuleName = "UserProfile", StackTrace = ex.StackTrace });
            return Request.CreateErrorResponse(HttpStatusCode.InternalServerError, ex.Message);
        }
    }

Это метод, который вызывается API для сохранения данных

 public async Task<MethodResult> EditUserProfile(UserProfile userProfile)
    {
        MethodResult methodResult = new MethodResult();
        bool profileComplete = true;
        try
        {

            if (userProfile.ImagePath == null && HttpContext.Current.Request.Files.Count == 0)
            {
                return new MethodResult() { Success = false, Message = "Profile Image is required !!" };
            }

              // some code here
           }
          catch(Exception ex)
          {
             // log error
          }
       }

здесь количество файлов всегда равно нулю в методе EditUserProfile вwebapi

Это код контроллера MVC

  [Authorize]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<JsonResult> SaveUserProfileDetails(UserProfile userProfile)
    {
        string Result = "true";
        try
        {
             var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Remove("Authorization");
            client.DefaultRequestHeaders.Add("Authorization", identity.FindFirst("AcessToken").Value);


            MultipartFormDataContent form = new MultipartFormDataContent();
            form.Add(new StringContent(userProfile.FirstName), "FirstName");
            form.Add(new StringContent(userProfile.UserId.ToString()), "UserId");
            form.Add(new StringContent(userProfile.LastName), "LastName");
            form.Add(new StringContent(userProfile.Designation), "Designation");
            form.Add(new StringContent(userProfile.Gender.ToString()), "Gender");
            form.Add(new StringContent(userProfile.City), "City");
            form.Add(new StringContent(userProfile.Country), "Country");
            form.Add(new StringContent(userProfile.DateOfBirth), "DateOfBirth");
            form.Add(new StringContent(userProfile.Specialties), "Specialties");
            if (Request.Files.Count > 0)
            {
                MemoryStream ms = new MemoryStream();
                Request.InputStream.CopyTo(ms);
                byte[] data = ms.ToArray();
                ByteArrayContent fileContent = new ByteArrayContent(data);
                fileContent.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { Name = "file"};

                form.Add(fileContent);
            }
            else
            {
                form.Add(new StringContent(userProfile.ImagePath), "ImagePath");
            }





            var resp = await client.PostAsync(Constant.ApiBaseUri + "Profile/EditUserProfileAsync", form);
            if (resp.IsSuccessStatusCode)
            {
                var result = await resp.Content.ReadAsStringAsync();
                MethodResultVM<string> methodResult = JsonConvert.DeserializeObject<MethodResultVM<string>>(result);
                Result = methodResult.Message;
            }
            else
            {
                Result = "false";

            }
        }
        catch (Exception ex)
        {
            Result = "false";
        }

        return Json(Result, JsonRequestBehavior.AllowGet);
    }

с этим я освобождаю входной поток в заголовке.Но я не хочу, чтобы приложения для Android и IOS уже использовали один и тот же API, и я не хочу изменять API.

Скажите, пожалуйста, что можно сделать, чтобы получить IMAGE в httpcontext в контроллере web api из объекта httpclient в контроллере mvc.

...