WebClient 抛出 SocketException(无效参数)

Mar*_*ens 5 .net c# webclient

我使用下面的代码尝试向 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);
Run Code Online (Sandbox Code Playgroud)

例外:(英语:提供了无效的参数)

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
Run Code Online (Sandbox Code Playgroud)

还尝试了以下代码,但它引发了相同的异常(但在.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);
}
Run Code Online (Sandbox Code Playgroud)

例外:(英语:提供了无效的参数)

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)
Run Code Online (Sandbox Code Playgroud)

Mar*_*ens 5

基于 Hans Passant 的评论

这是一个非常低级的事故,与您传递的参数无关,因为它们直到以后才被使用。底层 OS 函数 (WSASocket) 失败,似乎对创建 TCP 套接字不满意。这当然不应该发生。但是废话发生在网络代码上,总是有太多的垃圾挂在一个声称可以确保您的机器安全和平稳运行的套接字上。首先禁用已安装的反恶意软件产品,然后禁用任何类型的防火墙等等。

我发现对于我的情况,问题在于我在公司提供的网络驱动器上拥有我的解决方案存储库。我最好的猜测是,由于潜在的安全措施,上传失败了,尽管我没有深入研究它,无法证明情况确实如此。

在我的 c 驱动器上创建一个新的本地存储库克服了这个问题。

因此,对于遇到相同问题的功能读者,建议查看底层基础架构以解决问题。