无法接收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
相关产品推荐
相关产品推荐

