You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法接收UWP应用通过Windows.Web.Http发送至WebAPI控制器的文件

排查UWP上传文件到WebAPI接收失败的问题

我来帮你一步步梳理这个问题,先从你代码里的明显问题入手,再给出完整的解决方案:

1. 先修正代码里的低级错误

你的代码片段里有两处语法/参数传递问题,这会直接导致上传失败:

  • 参数名不能加引号:string "WebServiceURL" 要改成 string webServiceUrl,string "FilePathToUpload" 改成 string filePathToUpload
  • 获取文件时别用字符串字面量:StorageFile.GetFileFromPathAsync("FilePathToUpload") 要换成传入的参数 StorageFile.GetFileFromPathAsync(filePathToUpload),不然永远只会找名为"FilePathToUpload"的文件,而不是你实际要传的文件

2. 关键:用MultipartFormDataContent包装文件

WebAPI几乎都是期望接收multipart/form-data格式的上传请求,直接传HttpStreamContent会让控制器无法正确解析文件。你需要把文件内容包装到MultipartFormDataContent中,这是解决问题的核心。

3. 设置正确的文件类型和文件名

给HttpStreamContent设置对应的MIME类型,同时指定文件名,让WebAPI端能准确识别上传的文件信息。

修正后的完整UWP上传代码

public async Task UploadFileAsync(string webServiceUrl, string filePathToUpload)
{
    // 获取要上传的文件
    IStorageFile storageFile = await StorageFile.GetFileFromPathAsync(filePathToUpload);
    IRandomAccessStream stream = await storageFile.OpenAsync(FileAccessMode.Read);
    
    // 创建流内容并设置文件MIME类型
    var streamContent = new Windows.Web.Http.HttpStreamContent(stream);
    var contentType = Windows.Storage.StorageFile.GetFileContentType(storageFile);
    streamContent.Headers.ContentType = new Windows.Web.Http.Headers.HttpMediaTypeHeaderValue(contentType);
    
    // 用MultipartFormDataContent包装文件(参数名"file"要和WebAPI接收端一致)
    var multipartContent = new Windows.Web.Http.HttpMultipartFormDataContent();
    multipartContent.Add(streamContent, "file", storageFile.Name);
    
    // 发送请求并处理响应
    using (var httpClient = new Windows.Web.Http.HttpClient())
    {
        try
        {
            var response = await httpClient.PostAsync(new Uri(webServiceUrl), multipartContent);
            response.EnsureSuccessStatusCode(); // 检查请求是否成功
            string responseMsg = await response.Content.ReadAsStringAsync();
            // 这里可以添加上传成功后的逻辑
        }
        catch (Exception ex)
        {
            // 捕获并处理异常,比如打印错误信息
            System.Diagnostics.Debug.WriteLine($"上传失败:{ex.Message}");
        }
    }
}

WebAPI端对应的控制器写法(ASP.NET Core为例)

确保你的WebAPI控制器能正确接收multipart格式的文件:

[HttpPost("upload")]
public async Task<IActionResult> UploadFile(IFormFile file)
{
    if (file == null || file.Length == 0)
        return BadRequest("未接收到上传文件");
    
    // 示例:将文件保存到服务器指定目录
    var saveDir = Path.Combine(Directory.GetCurrentDirectory(), "Uploads");
    Directory.CreateDirectory(saveDir);
    var savePath = Path.Combine(saveDir, file.FileName);
    
    using (var stream = new FileStream(savePath, FileMode.Create))
    {
        await file.CopyToAsync(stream);
    }
    
    return Ok(new { Message = "文件上传成功", FileName = file.FileName });
}

额外注意事项

  • 给UWP应用配置文件访问权限:如果是访问本地文件,需要在Package.appxmanifest中添加文件系统权限(或特定文件夹权限)
  • 检查WebAPI的跨域设置:如果UWP和WebAPI不在同一域名下,要在WebAPI中配置CORS,允许UWP应用的域名访问
  • 别用async void:你的原方法用了async void,这会导致异常无法被正确捕获,建议改成async Task

内容的提问来源于stack exchange,提问作者slayernoah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:17:34