【问题标题】:UWP HttpClient disable "If" headersUWP HttpClient 禁用“If”标头
【发布时间】:2016-09-12 14:11:16
【问题描述】:

我在 UWP 和 HttpClient 中发现了一个有趣的特性(它也适用于 WebRequest): 任何 Http 请求都会发送“If-*”标头。我确实尝试过 UWP 和 WPF 应用程序。我向不支持“If-”标头的 Azure 文件存储发送了请求,如果要发送标头,将返回错误 400。所以这是我的代码:

HttpClient client = new HttpClient();
var response = await client.GetAsync("LINK_TO_AZURE_FILE_STORAGE_IMAGE");  

非常简单,两个应用程序相似。结果 - WPF 应用程序不发送“If-*”标头,UWP 会。所以这意味着我无法在 UWP 应用程序中使用文件存储,我只有错误 400。

我的问题是 - 我可以禁用这个 std...d 缓存吗?感谢您的关注

【问题讨论】:

    标签: c# http uwp


    【解决方案1】:

    是的,在 UWP 应用中使用 HttpClient 时,默认情况下会自动使用本地 HTTP 缓存。第一次,您的代码应该可以工作。然后你会在第一个响应中得到400 Error,它包含缓存数据,所有后续请求默认使用这个缓存,如下所示:

    要解决这个问题,我们可以使用Windows.Web.Http.HttpClient 类和HttpBaseProtocolFilter 类和HttpCacheControl 类来禁用缓存,如下所示:

    var filter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
    filter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.MostRecent;
    filter.CacheControl.WriteBehavior = Windows.Web.Http.Filters.HttpCacheWriteBehavior.NoCache;
    
    var httpClient = new Windows.Web.Http.HttpClient(filter);
    
    var response = await httpClient.GetAsync(new Uri("LINK_TO_AZURE_FILE_STORAGE_IMAGE"));
    

    为了使这个方法有效,我们需要确保没有本地 HTTP 缓存。如HttpCacheReadBehavior.MostRecent 表示,如果可能,它仍将使用本地 HTTP 缓存。所以我们最好先卸载应用,不要在应用中使用HttpClient client = new HttpClient();。

    更新:

    从 Windows 周年更新 SDK 开始,HttpCacheReadBehavior 枚举中添加了一个新的枚举值 NoCache。通过ReadBehavior和WriteBehavior的组合,我们可以实现各种缓存相关的行为。当我们不想使用本地缓存时,我们可以将ReadBehavior 设置为HttpCacheReadBehavior.NoCache,例如:

    var filter = new Windows.Web.Http.Filters.HttpBaseProtocolFilter();
    filter.CacheControl.ReadBehavior = Windows.Web.Http.Filters.HttpCacheReadBehavior.NoCache;
    
    var httpClient = new Windows.Web.Http.HttpClient(filter);
    

    【讨论】:

    • 哇!谢谢你变化很大!也许你知道——这个功能还是错误?因为在 Image 控件中我们无法访问 Http。将 URI 发送到 Image.Source 不是一个好主意,但也许有人需要该功能并且会遇到问题......
    • 我认为这是 UWP 中的一项功能,并且自 Windows 周年更新 SDK 以来,新的枚举值“NoCache”已添加到 HttpCacheReadBehavior 枚举中。有关详细信息,请参阅here。
    【解决方案2】:

    您是否尝试过使用HttpClient 类的DefaultRequestHeaders 属性的Remove 方法?

    【讨论】:

    • 是的,没有什么可以帮助我。此标头在构建后添加
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多