WebClient генерирует исключение SocketException (неверный аргумент) - PullRequest
0 голосов
/ 06 ноября 2018

Я использую приведенный ниже код в попытке создать файл на FTP-сервере. Однако я получаю исключение сокета. Может ли кто-нибудь помочь мне решить это исключение? Такая же проблема возникает, когда я использую функцию UploadFile(uri, filepath).

Я попытался установить учетные данные как NetworkCredentials в настройках WebClient, но получил тот же результат.

Получил такой же результат и на удаленном ftp-сервере.

Я использую .NET 4.7.1

byte[] xmlBytes = XmlDocumentToByteArray(xml);

WebClient webclient = new WebClient() {
    Proxy = null
};

Uri uri = new Uri("ftp://test:test@localhost/test.xml");
//Uri uri = new Uri("ftp://localhost/test.xml");
webclient.UploadData(uri, xmlBytes);

Исключение: (На английском языке: указан неверный аргумент)

System.Net.WebException: Er is een ongeldig argument opgegeven ---> System.Net.Sockets.SocketException: Er is een ongeldig argument opgegeven
   bij System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
   bij System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
   bij System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
   bij System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
   bij System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   bij System.Net.FtpWebRequest.QueueOrCreateConnection()
   bij System.Net.FtpWebRequest.SubmitRequest(Boolean async)
   --- Einde van intern uitzonderingsstackpad ---
   bij System.Net.WebClient.UploadDataInternal(Uri address, String method, Byte[] data, WebRequest& request)
   bij System.Net.WebClient.UploadData(Uri address, String method, Byte[] data)
   bij System.Net.WebClient.UploadData(Uri address, Byte[] data)
   bij ProbeOrderPlacement.Order.OrderSubmit.SubmitOrder(XmlDocument xml) in H:\VSWorkspace\VSTS\Quantore\Probe\ProbeOrderPlacement\Order\OrderPlacement.cs:regel 28

Также пробовал следующий код, но он выдает то же исключение (но на .GetRequestStream())

FtpWebRequest request = (FtpWebRequest)WebRequest.Create(new Uri("ftp://127.0.0.1/test.xml"));
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Proxy = null;
request.UseBinary = true;
request.Credentials = new NetworkCredential("test", "test");
request.ContentLength = xmlBytes.Length;

//Upload the data
using(Stream requestStream = request.GetRequestStream()) {
    requestStream.Write(xmlBytes, 0, xmlBytes.Length);
}

Exeption: (На английском языке: указан неверный аргумент)

System.Net.WebException: Er is een ongeldig argument opgegeven ---> System.Net.Sockets.SocketException: Er is een ongeldig argument opgegeven
   bij System.Net.Sockets.Socket..ctor(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
   bij System.Net.ServicePoint.GetConnection(PooledStream PooledStream, Object owner, Boolean async, IPAddress& address, Socket& abortSocket, Socket& abortSocket6)
   bij System.Net.PooledStream.Activate(Object owningObject, Boolean async, GeneralAsyncDelegate asyncCallback)
   bij System.Net.PooledStream.Activate(Object owningObject, GeneralAsyncDelegate asyncCallback)
   bij System.Net.ConnectionPool.GetConnection(Object owningObject, GeneralAsyncDelegate asyncCallback, Int32 creationTimeout)
   bij System.Net.FtpWebRequest.QueueOrCreateConnection()
   bij System.Net.FtpWebRequest.SubmitRequest(Boolean async)
   --- Einde van intern uitzonderingsstackpad ---
   bij System.Net.FtpWebRequest.GetRequestStream()
   bij ProbeOrderPlacement.Order.OrderSubmit.SubmitOrder(XmlDocument xml)

Ответы [ 4 ]

0 голосов
/ 12 ноября 2018

Основано на этом комментарии Ханса Пассанта

Это неудача очень низкого уровня, не имеющая ничего общего с аргументами, которые вы передали, так как они не используются позже. Основная функция ОС (WSASocket) не удалась, казалось бы, недовольна созданием сокета TCP. Это никогда не должно случиться, конечно. Но дерьмо случается с сетевым кодом, всегда слишком много мусора, свисающего с сокета, который, как утверждается, обеспечивает безопасность и бесперебойную работу вашей машины. Сначала отключите установленный антивирусный продукт, любой брандмауэр и еще много чего.

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

Создание нового локального репозитория на моем диске c устранило проблему.

Таким образом, совет для читателей функций, которые испытывают то же самое, заключается в том, чтобы взглянуть на базовую инфраструктуру, чтобы преодолеть проблему.

0 голосов
/ 11 ноября 2018

Ваш ftp url кажется неправильным. Измените свой код на

byte[] xmlBytes = XmlDocumentToByteArray(xml);
WebClient webclient = new WebClient
{
      Proxy = null,
      Credentials = new NetworkCredential("test", "test")
};

Uri uri = new Uri("ftp://localhost/test.xml");
webclient.UploadData(uri, xmlBytes);
0 голосов
/ 11 ноября 2018

Я только что попробовал ваш код как есть, за исключением одного изменения (чтение файла XML и преобразование его в byte[]), и я смог загрузить файл без каких-либо проблем.

enter image description here

Поскольку вы не поделились своей структурой XML или методом, который вы используете для чтения и преобразования XML в byte[], я остановился на простейшей форме XML и вне -box метод в .NET для чтения и преобразования данных файла в byte[].

Вот текст XML из файла source.xml:

<System>
    <E01></E01>
    <E02></E02>
    <E03></E03>
</System>

Вот мой код для чтения-преобразования-загрузки source.xml на ftp-сервер:

        byte[] xmlBytes = File.ReadAllBytes ("D:\\source.xml");

        WebClient webclient = new WebClient ()
        {
            Proxy = null
        };

        Uri uri = new Uri ("ftp://ftp_user:ftp_password@localhost/test.xml");
        //Uri uri = new Uri("ftp://localhost/test.xml");
        webclient.UploadData (uri, xmlBytes);

ПРИМЕЧАНИЕ: Это сборка приложения Winforms на .NET Framework 4.7.1

Если у вас есть какие-то конкретные требования в отношении структуры XML или способа чтения файла, вы можете поделиться им, и мы можем обсудить это далее.

В качестве альтернативы, вы можете поделиться урезанной версией вашего решения на Github для устранения неполадок.

Надеюсь, это поможет!

0 голосов
/ 06 ноября 2018

Посмотрите на Метод WebClient.UploadFile . Вторым аргументом является имя файла. Для byte[]

нет перегрузки

попробуйте это

webclient.UploadData(uri, xmlfilename);
...