绑定图像ImageSource到URL中断HttpClient NTLM握手

时间:2013-06-07 15:29:12

标签: c# windows-authentication ntlm dotnet-httpclient

我有一个.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>

0 个答案:

没有答案