C# 将映像ImageSource绑定到URL会中断HttpClient NTLM握手
我有一个.NET 4.5 WPF应用程序,它在网格中显示许多图标-这些图标是通过将图像控件的ImageSource设置为特定URL(无需验证)加载的。此外,还可以按下一个按钮,通过HttpClient从内部web服务检索一些数据,该服务由windows身份验证(NTLM,而不是Kerberos)保护 我注意到这种设置有一些非常奇怪的行为。如果我保持原样,当按下按钮时,NTLM握手实际上会在第一步之后失败(客户机将发送请求并接收401,然后拒绝使用auth头再次发送)。但是,如果我将ImageSource更改为不绑定任何内容或本地文件,或者通过在后台使用HttpClient下载文件手动创建ImageSource,NTLM握手将正常完成 这似乎发生在任何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
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的持久连接的好处。哈,这是一个很好的观点,我没有考虑到这一点!谢谢