Как загрузить изображение в картинке, когда соединение с сайтом изображения не является частным? - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть ссылка, предоставленная ip-камерой ONVIF, которая содержит снимок, сделанный этой камерой.

Когда я пытаюсь открыть эту ссылку в браузере, таком как Chrome, я получаю следующее приглашение:

Your connection to this site is not private

Когда я пытаюсь загрузить это изображение из окна рисунка ac # windows, я получаю следующую ошибку:

Загрузка:

picturebox0.Load(mySnapUrl);

Ошибка:

System.Net.WebException: 'The remote server returned an error: (401) Unauthorized.'

Я могу увидеть изображение в своем браузере один разЯ ввожу соответствующее имя пользователя и пароль.

Можно ли как-нибудь загрузить такое изображение в коробку с картинками?

РЕДАКТИРОВАТЬ 1:

Iпопытался это решение вручную загрузить изображение в веб-клиент, в который я добавил учетные данные вручную, и я все еще получаю ту же ошибку в строке downloadData.

WebClient wc = new WebClient();
CredentialCache cc = new CredentialCache();
cc.Add(new Uri(mySnapUrl), "Basic", new NetworkCredential(user, password));
wc.Credentials = cc;
MemoryStream imgStream = new MemoryStream(wc.DownloadData(mySnapUrl));//Error
picturebox0.Image = new System.Drawing.Bitmap(imgStream);

1 Ответ

0 голосов
/ 01 марта 2019

Как сказали @Simon Mourier и @Reza Aghaei в комментариях, мне не нужно было добавлять CredentialCache, а только Credentials.Решение аналогично этому .

Решение:

WebClient wc = new WebClient();
wc.Credentials = new NetworkCredential(user, password);
MemoryStream imgStream = new MemoryStream(wc.DownloadData(mySnapUrl));//Good to go!
picturebox0.Image = new System.Drawing.Bitmap(imgStream);

Редактировать:

Лично я должен был иметь возможность загружать указанное изображение асинхронно, потому что раньше я загружал свои изображения с помощью picturebox0.LoadAsync(mySnapUrl).

Я получил большую идею из этого источника .

Чтобы иметь возможность сопоставить изображение с учетными данными, я создал async Task для загрузки изображения ...

private async Task<Image> GetImageAsync(string snapUrl, string user, string password)
{
    var tcs = new TaskCompletionSource<Image>();

    Action actionGetImage = delegate ()
    {
        WebClient wc = new WebClient();
        wc.Credentials = new NetworkCredential(user, password);
        MemoryStream imgStream = new MemoryStream(wc.DownloadData(snapUrl));
        tcs.TrySetResult(new System.Drawing.Bitmap(imgStream));
    };

    await Task.Factory.StartNew(actionGetImage);

    return tcs.Task.Result;
}

... и затем установил для изображения следующее:

var result = GetImageAsync(mySnapUrl, user, password);
result.ContinueWith(task =>
{
    picturebox0.Image = task.Result;
});
...