简体   繁体   中英

How to resolve 400 error with bad request in update api when it is deployed

I am getting 400 error code with bad request while request to file upload API.

I built the back-end and front-end for file uploading in asp.net core and it works in localhost when I run it with IIS in my PC (using visual studio 2017). Both of saving and updating API are working in my local but update API is not working if I deploy the code

front-end code like below:

 public static async Task<HttpResponseMessage> UploadFile(string uploadUrl, string filePath, FFFileInfo fileInfo)
        {
            string fileName = fileInfo.Name + "." + fileInfo.Extension;
            string contentType = MimeTypes.GetMimeType(filePath);

            using (var hc = new HttpClient())
            {
                hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(TokenType, AccessToken);
                hc.DefaultRequestHeaders.Accept.Clear();
                hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                Stream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
                StreamContent streamContent = CreateFileContent(fileStream, fileName, contentType);
                // StreamContent streamContent = CreateFileContent(fileStream, "image.jpg", "image/jpeg");  // Multiple file upload

                var requestContent = new MultipartFormDataContent("Upload Id" + DateTime.Now.ToString(CultureInfo.InvariantCulture));
                requestContent.Add(streamContent, fileInfo.Name, fileName);
                var progressContent = new ProgressableStreamContent(
                     requestContent,
                     4096,
                     (sent, total) =>
                     {
                         //Console.WriteLine("Uploading {0}/{1}", sent, total);
                         int percentage = (int) Math.Round((double)(100 * sent) / total);
                         Console.Write("\r{0}\t{1}%", fileInfo.Path, percentage);
                         if (sent == total)
                         {
                             Console.WriteLine();
                         }
                     });

                var response = await hc.PostAsync(new Uri(uploadUrl), progressContent);

                return response;
            }
        }

backend code like below:

[HttpPost]
        [DisableFormValueModelBinding]
        public async Task<IActionResult> UploadFiles([FromQuery] FFFileInfo fileinfo)
        {
            if (!MultipartRequestHelper.IsMultipartContentType(Request.ContentType))
            {
                return BadRequest($"Expected a multipart request, but got {Request.ContentType}");
            }
            authUser = User.ToAuthUser();
            userId = authUser.UserId();
            customerId = authUser.CustomerId();

            Server.Model.File new_file = new Server.Model.File();

            var boundary = MultipartRequestHelper.GetBoundary(MediaTypeHeaderValue.Parse(Request.ContentType), _defaultFormOptions.MultipartBoundaryLengthLimit);
            var reader = new MultipartReader(boundary, HttpContext.Request.Body);

            var section = await reader.ReadNextSectionAsync();

            MemoryStream writeStream = new MemoryStream();
            byte[] content = null;

            while (section != null)
            {
                ContentDispositionHeaderValue contentDisposition;
                var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition);
                int chunkSize = 1024;
                byte[] byte_file = new byte[chunkSize];
                int bytesRead = 0;

                new_file.File_Content = byte_file;

                if (hasContentDispositionHeader)
                {
                    if (MultipartRequestHelper.HasFileContentDisposition(contentDisposition))
                    {
                        //await section.Body.CopyToAsync(targetStream);
                        using (var byte_reader = new BinaryReader(section.Body))
                        {
                            do
                            {
                                bytesRead = byte_reader.Read(byte_file, 0, byte_file.Length);
                                if(bytesRead <= 0)
                                {
                                    content = writeStream.ToArray();
                                }
                                writeStream.Write(byte_file, 0, bytesRead);
                            } while (bytesRead > 0);

                            content = writeStream.ToArray();

                        }
                    }
                }
                // Drains any remaining section body that has not been consumed and
                // reads the headers for the next section.
                section = await reader.ReadNextSectionAsync();
            }

            try
            {
                new_file = new Server.Model.File
                {
                    File_Name = fileinfo.Name,
                    File_Path = fileinfo.Path,
                    File_Ext = fileinfo.Extension,
                    Check_Sum = fileinfo.Checksum,
                    ToolSerialNumber = fileinfo.ToolSerialNumber,
                    FileSize = fileinfo.Length,
                    File_Content = content,
                    UserId = userId,
                    CustomerId = customerId
                };
            }
            catch (Exception ex)
            {
                return BadRequest(ex);
            }

            try
            {
                if (!fileService.isExist(new_file.File_Path, userId))
                {
                    fileService.SaveFile(new_file);
                }
                else
                {
                    Server.Model.File existing = fileService.GetFileByPath(new_file.File_Path, userId);
                    fileService.UpdateFile(existing, new_file);
                }

                //set file content to null to response with small data
                new_file.File_Content = null;
                return Ok(new_file);
            }
            catch (Exception ex)
            {
                logger.LogError("DB action error {0}", ex.ToString());
                return BadRequest(ex);
            }
        }

As you can see the above code, saving and updating are using same code but only updating is not working when it is deployed. It is very strange for me.

I found the solution. This code was deployed by my client I couldn't check the database that he deployed. Based on researching and testing, I got an idea that might be related with permission issue. So, we check it for db.

At the end, we found that current user has insert, delete, select permission but have not update permission. After granting the update permission, it is working perfectly

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM