将数据和文件从MVC Controller(NET Framework 4.6.1)发送到WebAPI Controll



我要实现的是将数据从MVC控制器(它正确接收所有参数(发送到API,我无法更改API,所以我必须在网络上工作。我所知道的是序列化是错误的,但我没有找到正确的方法来实现这一目标。那么,如何解析数据以将其发送到 API?

MVC 模型

public class FoodModel
{
public int FoodID { get; set; }
public string FoodName { get; set; }
public string UPCScan { get; set; }
public HttpPostedFileBase ImageFile { get; set; }
public int? FactoryID { get; set; }
public int? FoodClassificationID { get; set; }
public string TypeProduct { get; set; }
public decimal? Quantity { get; set; }
public int? MeasurementID { get; set; }
}

MVC 控制器

public async Task<EResponseBase<Food_Response_v1>> InsertOrUpdate(FoodModel model)
{
var request = JsonConvert.SerializeObject(model);
var content = new StringContent(request, Encoding.UTF8, "application/json");
var client = new HttpClient();
client.BaseAddress = new Uri(_urlBase);
var response = client.PostAsync(_endPointInsertOrUpdate, content).Result;
if (response.StatusCode == HttpStatusCode.OK)
{
var result = await response.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<EResponseBase<Food_Response_v1>>(result);
}
else
{
return new EResponseBase<Food_Response_v1>
{
IsResultList = false,
Code = (int)response.StatusCode,
Message = "Error"
};
}
}

NETCoreAPI 模型

public class Food_Request_v1
{
public int FoodID { get; set; }
public string FoodName { get; set; }
public string UPCScan { get; set; }
public IFormFile ImageFile { get; set; }
public int? FactoryID { get; set; }
public int? FoodClassificationID { get; set; }
public string TypeProduct { get; set; }
public decimal? Quantity { get; set; }
public int? MeasurementID { get; set; }
public Measurement_Response_v1 Measurement { get; set; }
public Factory_Response_v1 Factory { get; set; }
}

NETCoreAPI 控制器

[Route("InsertOrUpdate")]
[HttpPost]
public async Task<EResponseBase<Food_Response_v1>> InsertOrUpdate([FromForm]  Food_Request_v1 request)
{
logger.Print_InitMethod();
try
{
logger.Print_Request(request);
var path = string.Empty;
if(request.ImageFile != null && request.ImageFile.Length > 0 )
{
path = Path.Combine(Directory.GetCurrentDirectory(), "wwwroot\Foods", request.ImageFile.FileName);
using(var stream = new FileStream(path, FileMode.Create))
{
await request.ImageFile.CopyToAsync(stream);
}
path = $"/Foods/{request.ImageFile.FileName}";
}
var requestConvert = ToFood(request,path);
var responseJSON = service.InsertOrUpdate(requestConvert, requestConvert.FoodID);
logger.Print_Response(responseJSON);
var response = Mapper.Map<EResponseBase<Food_Response_v1>>(responseJSON);
return response;
}
catch (Exception ex)
{
logger.Error(ex);
return new UtilitariesResponse<Food_Response_v1>(config).setResponseBaseForException(ex);
}
finally
{
logger.Print_EndMethod();
}
}

使用MultipartFormDataContent作为 HttpContent 类型,如下所示:

[HttpPost]
public async Task<EResponseBase<Food_Response_v1>> InsertOrUpdate(FoodModel model)
{
using (var client = new HttpClient())
{
using (var content = new MultipartFormDataContent())
{
var fileContent = new StreamContent(model.ImageFile.InputStream)
{
Headers =
{
ContentLength = model.ImageFile.ContentLength,
ContentType = new MediaTypeHeaderValue(model.ImageFile.ContentType),
ContentDisposition=new ContentDispositionHeaderValue("form-data")
{
Name = "ImageFile",
FileName = model.ImageFile.FileName
}
}
};
content.Add(fileContent);
content.Add(new StringContent(model.FoodName), "FoodName");
content.Add(new StringContent(model.UPCScan), "UPCScan");
content.Add(new StringContent(model.FactoryID.ToString()), "FactoryID");
content.Add(new StringContent(model.FoodClassificationID.ToString()), "FoodClassificationID");
content.Add(new StringContent(model.TypeProduct), "TypeProduct");
content.Add(new StringContent(model.Quantity.ToString()), "Quantity");
content.Add(new StringContent(model.MeasurementID.ToString()), "MeasurementID");
client.BaseAddress = new Uri(_urlBase);
var response = client.PostAsync(_endPointInsertOrUpdate, content).Result;
}
}
//other stuffs you want
}

最新更新