Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将映像ImageSource绑定到URL会中断HttpClient NTLM握手_C#_Windows Authentication_Ntlm_Dotnet Httpclient - Fatal编程技术网

C# 将映像ImageSource绑定到URL会中断HttpClient NTLM握手

C# 将映像ImageSource绑定到URL会中断HttpClient NTLM握手,c#,windows-authentication,ntlm,dotnet-httpclient,C#,Windows Authentication,Ntlm,Dotnet Httpclient,我有一个.NET 4.5 WPF应用程序,它在网格中显示许多图标-这些图标是通过将图像控件的ImageSource设置为特定URL(无需验证)加载的。此外,还可以按下一个按钮,通过HttpClient从内部web服务检索一些数据,该服务由windows身份验证(NTLM,而不是Kerberos)保护 我注意到这种设置有一些非常奇怪的行为。如果我保持原样,当按下按钮时,NTLM握手实际上会在第一步之后失败(客户机将发送请求并接收401,然后拒绝使用auth头再次发送)。但是,如果我将ImageSo

我有一个.NET 4.5 WPF应用程序,它在网格中显示许多图标-这些图标是通过将图像控件的ImageSource设置为特定URL(无需验证)加载的。此外,还可以按下一个按钮,通过HttpClient从内部web服务检索一些数据,该服务由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>

试验

对于这个离题的问题,很抱歉,但是您是在哪里第一次学习在using块中使用httpClientHandler和httpClient的技术的?我认为这是HttpClient的一种反模式,我正试图找到这种做法的根源。谢谢。对不起,我帮不上你的忙!不用担心,我并没有从任何地方得到这种模式,我所看到的只是它们都是一次性的,所以我想我还是在这个测试应用程序中去掉它们为好。这也证明了无论bug是什么,它都与HttpClient的特定实例无关。问题是,你丢掉了HttpClient的许多好处,加上它强制关闭了TCP连接,去掉了Http 1.1的持久连接的好处。哈,这是一个很好的观点,我没有考虑到这一点!谢谢