2

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

0 回答 0