繁体   English   中英

将数据和文件从 MVC 控制器(NET Framework 4.6.1)发送到 WebAPI 控制器(NET Core 3.0)

[英]Send data and file from MVC Controller (NET Framework 4.6.1) to WebAPI Controller (NET Core 3.0)

我想要实现的是将数据从 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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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