我有一个 .NET 4.5 WPF 应用程序,它在网格中显示许多图标 - 这些图标是通过将 Image 控件的 ImageSource 设置为特定 URL(无需身份验证)来加载的。此外,还有一个按钮可以按下以从内部 Web 服务中检索一些数据,该服务通过 HttpClient 使用 Windows 身份验证(NTLM,而不是 Kerberos)进行保护。
我注意到这个设置有一些非常奇怪的行为。如果我保持原样,当按下按钮时,NTLM 握手实际上会在第一步之后失败(客户端将发送请求并接收 401,然后拒绝再次发送带有身份验证头的消息)。但是,如果我将 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>