.NET Maui调用Dropbox API下载文件Android模拟器报错
.NET Maui Android平台调用Dropbox API下载文件报错
在Visual Studio 2022中基于James Montemagno的基础示例开发.NET Maui应用,调用Dropbox API(通过Visual Studio包)下载文件时,Windows平台运行正常,但Android模拟器上出现以下错误:
调用API函数"files/download"出错:错误的HTTP"Content-Type"头:"application/x-www-form-urlencoded"。预期为"text/plain; charset=utf-8"、"application/octet-stream"、"application/octest-stream;charset=utf-8"之一。
相关代码如下:
using Dropbox.Api.Files; using Dropbox.Api.Users; public HttpClient CreateClient() { #if __ANDROID__ return new HttpClient(new Xamarin.Android.Net.AndroidMessageHandler()); #else return new HttpClient(); #endif } public async Task GetInfoFromDropbox() { string szFileName = "Somefile.dat"; string szDropBoxToken = "myDropboxToken"; httpClient = CreateClient(); var objDbx = new DropboxClient(szDropBoxToken, new DropboxClientConfig() { HttpClient = httpClient }); // 代码在此处报错 var result = await objDbx.Files.DownloadAsync(szFileName); // Windows平台可正常执行后续代码 var result2 = await result.GetContentAsStreamAsync(); }
解决方案
该问题根源是AndroidMessageHandler在处理请求时自动添加了不符合Dropbox要求的Content-Type头,以下两种方法可解决:
方法一:自定义消息处理程序修正请求头
创建继承自AndroidMessageHandler的自定义处理程序,在发送请求前针对Dropbox下载接口修正Content-Type:
public class CustomAndroidMessageHandler : AndroidMessageHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.RequestUri.PathAndQuery.Contains("files/download")) { request.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/octet-stream"); } return base.SendAsync(request, cancellationToken); } }
修改CreateClient方法使用自定义处理程序:
public HttpClient CreateClient() { #if __ANDROID__ return new HttpClient(new CustomAndroidMessageHandler()); #else return new HttpClient(); #endif }
方法二:通过Dropbox客户端配置全局修正请求头
创建DropboxClient时,通过请求拦截器覆盖错误的Content-Type设置:
var config = new DropboxClientConfig() { HttpClient = httpClient, HttpRequestInterceptor = (request) => { request.Content?.Headers.Remove("Content-Type"); request.Content?.Headers.TryAddWithoutValidation("Content-Type", "application/octet-stream"); return Task.CompletedTask; } }; var objDbx = new DropboxClient(szDropBoxToken, config);
补充说明
- 方法一仅针对下载接口修正头信息,更精准;方法二全局覆盖Dropbox客户端的请求头,适合多API调用场景。
- 测试时需确认Android模拟器网络可正常访问Dropbox服务,排除网络问题导致的其他异常。
内容的提问来源于stack exchange,提问作者John Strudwick
相关产品推荐
相关产品推荐

