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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:17