@garinov
Фрилансер

Почему Вконтакт обрывает соединение при постинге в VK через API Wall.Post?

Появилась необходимость залить в паблики нашего небольшого бизнеса несколько сотен картинок товаров. Написал небольшие приложения: с Инстаграмом и Твиттером все проходит удачно, а Вконтакт какой-то капризный оказался. Использовал библиотеку vknet.github.io/vk

Приложение начинает постить, но в какой-то момент падает. Причем, чем больше период между запросами, тем на меньшем кол-ве запросов происходит падение. Например, при периоде около 1 сек до 40 постов создает, а при большом периоде в несколько минут - падает на третьем посте.

В большинстве случаев ошибка происходит при загрузке изображения в этом коде:
var responseImg = Encoding.ASCII.GetString(wc.UploadFile(uploadServer.UploadUrl, item.img));

т.е. "виноват" как я понимаю var wc = new WebClient();

Как это исправить? Ниже весь код и пример ошибки.

Весь код
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.IO;
using System.Net;
using System.Text;
using System.Threading;
using VkNet;
using VkNet.Enums.Filters;
using VkNet.Model.RequestParams;

namespace DinastyVK
{
    class Program
    {
        static void Main(string[] args)
        {
            int appID = 11111111111111;                      // ID приложения
            string email = "fdhadfhdafhfdhfdh@mail.ru";         // email
            string pass = "zzzzzzzzzzzzzzz";               // пароль для авторизации
            Settings scope = Settings.All;      // Приложение имеет доступ

            int personId = 2222222222; // id юзера
            long groupId = 3333333333; // id группы, в которую делается пост или репост

            string pathDir = @"C:\Users\HOME\Documents\Images\";
            var lines = File.ReadAllLines(pathDir + "FileName.txt"); // CSV - 1 колонка путь к картинке, 2 - текст

            var vk = new VkApi();
            vk.Authorize(new ApiAuthParams
            {
                ApplicationId = (ulong)appID,
                Login = email,
                Password = pass,
                Settings = scope
            });

            List<Lines> ln = new List<Lines>();
            for (int i = 0; i < lines.Length; i++)
            {
                var path = lines[i].Split(new Char[] { '|' });
                ln.Add( new Lines( path[0], path[1] ));
            }

            int c = 1;
            foreach (var item in ln)
            {
                try
                {
                    var uploadServer = vk.Photo.GetWallUploadServer();             // Получить адрес сервера для загрузки.
                    var wc = new WebClient();
                    wc.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
                    var responseImg = Encoding.ASCII.GetString(wc.UploadFile(uploadServer.UploadUrl, item.img)); // Загрузить фотографию.
                    var photos = vk.Photo.SaveWallPhoto(responseImg, (ulong)groupId);            // Сохранить загруженную фотографию

                    PostToProfileWithPublishDate(vk, photos, personId, item.txt, c);

                    Console.WriteLine("Загружено " + c++);
                    Thread.Sleep(1000);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        private static void PostToProfileWithPublishDate(VkApi vk, ReadOnlyCollection<VkNet.Model.Attachments.Photo> photos, int personId, string massage, int i)
        {
            var post = vk.Wall.Post(new WallPostParams
            {
                OwnerId = personId,
                FromGroup = true,
                Message = massage,
                Attachments = photos,
                Signed = true,
                PublishDate = DateTime.UtcNow.AddHours(i),
            });
        }
    }
}



System.Net.WebException не обработано
HResult=-2146233079
Message=Исключение во время запроса WebClient.
Source=System
StackTrace:
в System.Net.WebClient.UploadFile(Uri address, String method, String fileName)
в System.Net.WebClient.UploadFile(String address, String fileName)
в DinastyVK.Program.Main(String[] args) в C:\Users\HOME\documents\visual studio 2015\Projects\DinastyVK\DinastyVK\Program.cs:строка 56
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
InnerException:
HResult=-2146232800
Message=Не удается записать данные в транспортное соединение: Удаленный хост принудительно разорвал существующее подключение.
Source=System
StackTrace:
в System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.Security._SslStream.StartWriting(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.Security._SslStream.ProcessWrite(Byte[] buffer, Int32 offset, Int32 count, AsyncProtocolRequest asyncRequest)
в System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.PooledStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.ConnectStream.InternalWrite(Boolean async, Byte[] buffer, Int32 offset, Int32 size, AsyncCallback callback, Object state)
в System.Net.ConnectStream.Write(Byte[] buffer, Int32 offset, Int32 size)
в System.Net.WebClient.UploadBitsState.WriteBytes()
в System.Net.WebClient.UploadBits(WebRequest request, Stream readStream, Byte[] buffer, Int32 chunkSize, Byte[] header, Byte[] footer, CompletionDelegate uploadCompletionDelegate, CompletionDelegate downloadCompletionDelegate, AsyncOperation asyncOp)
в System.Net.WebClient.UploadFile(Uri address, String method, String fileName)
InnerException:
ErrorCode=10054
HResult=-2147467259
Message=Удаленный хост принудительно разорвал существующее подключение
NativeErrorCode=10054
Source=System
StackTrace:
в System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
в System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
InnerException:
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через TM ID
Похожие вопросы
LATOKEN Москва
от 150 000 до 250 000 руб.
от 120 000 до 160 000 руб.
15 июля 2018, в 15:03
18000 руб./за проект
15 июля 2018, в 14:20
5000 руб./за проект