我有一个.NET 4.5 WPF应用程序,它在网格中显示许多图标 - 通过将Image控件的ImageSource设置为特定URL(无需身份验证)来加载这些图标。此外,还有一个按钮可以从内部Web服务中检索某些数据,该服务通过HttpClient通过Windows身份验证(NTLM,而不是Kerberos)进行保护。
我注意到这种设置有一些非常奇怪的行为。如果我保持原样,当按下按钮时,NTLM握手实际上将在第一步之后失败(客户端将发送请求并接收401,然后拒绝再次使用auth标头发送)。但是,如果我将ImageSource更改为无任何内容或本地文件,或者通过在后台使用HttpClient下载文件来手动创建ImageSource,则NTLM握手正常完成。
这似乎发生在任何NTLM网站和任何托管图片的网站上。有没有人经历过这个?
以下是我在一起测试的应用程序中发生这种情况的一个例子。 视图模型:
public class ViewModel : ViewModelBase
{
public string Image { get; set; }
public ICommand DownloadData { get; set; }
public ViewModel()
{
DownloadData = new RelayCommand(() =>
{
using(var handler = new HttpClientHandler { Credentials = CredentialCache.DefaultNetworkCredentials })
using (
var client = new HttpClient(handler)
{
BaseAddress = new Uri("http://somentlmservice.com")
})
{
var data = client.GetAsync("/someresource").Result
}
});
Image = "http://static.adzerk.net/Advertisers/12f0cc69cd9742faa9c8ee0f7b0d210e.jpg";
}
}
并查看:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<Image Source="{Binding Image}" Height="60" Width="60" />
<Button Command="{Binding DownloadData}">Test</Button>
</StackPanel>
</Window>