如何使用 WebClient 从 ASP.NET webform 调用 ASP.NET Core web api 项目中的文件上传 (IFormFile) api?

问题描述 投票:0回答:1

我在 ASP.NET Core 3.1 项目中创建了一个用于文件上传的 API。当我从 Postman 或任何其他使用 HttpClient 的 .NET Core 项目调用 api 时,此 api 工作正常。但是我无法使用 WebClient 从 Webform 调用这个 api。

[HttpPost("Upload")]
public IActionResult Upload([FromForm] IFormFile fileUpload)
{
    ResponseViewModel responseModel = new ResponseViewModel();
    try
    {       
        if (fileUpload == null)
        {
            responseModel.Message = "Please select file.";
            return BadRequest(responseModel);
        }

        //file upload to temp folder
        string tempFilPathWithName = Path.GetTempFileName();
        using (FileStream file = System.IO.File.OpenWrite(tempFilPathWithName))
        {
            fileUpload.CopyTo(file);
        }
        UploadFile uploadFile = new UploadFile()
        {
            FileName = fileUpload.FileName,
            TempFilPathWithName = tempFilPathWithName
        };

        responseModel.Model = uploadFile;
        responseModel.Message = "File successfully uploaded";
        return Ok(responseModel);
    }
    catch (Exception ex)
    {
        responseModel.ExceptionMessage = ex.ToString();
        responseModel.Message = "File upload failed.";
    }
    return BadRequest(responseModel);
}

public class ResponseViewModel
{   
    public object Model { get; set; }
    public string ExceptionMessage { get; set; }
    public string Message { get; set; } 
}

在服务器上上传文件后(部署 ASP.NET Core wep api 项目的地方)我会得到如下响应:上传的文件路径和名称。

asp.net-core webforms webclient iformfile
1个回答
0
投票

当我从 Postman 或任何其他调用 api 时,这个 api 工作正常 使用 HttpClient 的 .NET Core 项目。但我无法调用此 api 从 Webform 使用 WebClient.

如果你能详细分享你的请求代码片段会更好但除此之外你可以实现使用HttpClient.

除此之外,从 ASP.NET webform 项目发送文件请求您需要 MultipartFormDataContent 以便您可以相应地实现您的要求。

在服务器上上传文件后(ASP.NET Core wep api 项目 部署)我会得到这样的回应:上传的文件路径和名称。

让我们快速演示一下我们如何有效地实施它:

文件从 ASP.NET webform 上传到 Asp.net Core Web API:

public partial class Contact : Page
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            RegisterAsyncTask(new PageAsyncTask(UploadFileFromAspDotNetWebFormToWebAPI));
        }
            
        static readonly HttpClient client = Client.GetClient();
        private async Task UploadFileFromAspDotNetWebFormToWebAPI()
        {
            //Bind your file location
            var readFileData = System.IO.File.ReadAllBytes(@"D:\Md Farid Uddin Resume.pdf");
            //Create Multipart Request
            var formContent = new MultipartFormDataContent();
            formContent.Add(new StreamContent(new MemoryStream(readFileData)), "fileUpload", "fileUpload");
            var response = await client.PostAsync("https://localhost:7132/api/Upload/UploadFromWebFromToWebAPI", formContent);
            if (response.IsSuccessStatusCode)
            {
                var readResponse = await response.Content.ReadAsStringAsync();
                ResponseViewModel readApiResponse = JsonConvert.DeserializeObject<ResponseViewModel>(readResponse);
            }

        }
       
    }

注意: 要在此处找到的重要点,在 StreamContent 中,您应该将请求参数与您的控制器参数定义相匹配。在您的场景中,您的控制器名称是fileUpload;因此,它应该完全匹配,最后一个是你想要传递的文件名,这是强制性的,我保持不变,但你可以放任何东西。否则,请求将无法到达端点。

响应模型:

public class ResponseViewModel
{   
    public object Model { get; set; }
    public string ExceptionMessage { get; set; }
    public string Message { get; set; } 
}

输出:

注意:如果您想了解更多详细信息,可以在这里查看我们的官方文档。

© www.soinside.com 2019 - 2024. All rights reserved.