@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:
  • Вопрос задан
  • 41 просмотр
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы