グリッドに多数のアイコンを表示する .NET 4.5 WPF アプリケーションがあります。これらのアイコンは、Image コントロールの ImageSource を特定の URL に設定することで読み込まれます (認証は不要です)。さらに、HttpClient を介して Windows 認証 (Kerberos ではなく NTLM) で保護されている内部 Web サービスから一部のデータを取得するために押すことができるボタンがあります。
このセットアップで、非常に奇妙な動作に気付きました。そのままにしておくと、ボタンが押されたときに、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>