我使用下面的代码来尝试创建文件到ftp服务器。但是我得到一个套接字异常。谁能帮我解决这个异常?当我使用UploadFile(uri, filepath)
函数时,似乎也会发生相同的问题。
我也尝试在WebClient的选项中将凭据设置为NetworkCredentials
,但得到的结果相同。
在远程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);
}
产品: (英语:提供了无效的论据)
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)
答案 0 :(得分:4)
基于Hans Passant的评论
这是一个非常低级的事故,与您传递的参数无关,因为它们直到以后才被使用。底层的OS函数(WSASocket)失败了,似乎对创建TCP套接字不满意。当然,那永远不会发生。但是,随着网络代码的废话发生,总是有太多的垃圾挂在插座上,以保证您的机器安全和平稳运行。首先,请禁用已安装的反恶意软件产品,然后禁用任何类型的防火墙,然后禁用。
我发现,就我的情况而言,问题是我的公司将解决方案存储在网络驱动器上。我最好的猜测是,由于底层安全措施,上传失败了,尽管我没有深入研究它,无法证明是这种情况。
在我的C盘上创建新的本地存储库解决了该问题。
因此,对于经验丰富的功能读者来说,建议是查看底层基础架构以解决该问题。
答案 1 :(得分:0)
答案 2 :(得分:0)
您的ftp网址似乎有误。将您的代码更改为
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);
答案 3 :(得分:0)
我只是按原样尝试了您的代码,只做了一次更改(读取XML文件并将其转换为public boolean exists ()
),并且我能够毫无问题地上传文件。
由于您尚未共享XML结构或用于读取XML并将其转换为byte[]
的方法,因此我使用了最简单形式的XML 和 out- byte[]
中的即用型方法,用于读取文件数据并将其转换为.NET
。
这是source.xml文件中的XML文本:
byte[]
这是我的代码,用于在ftp服务器上读取-转换-上传source.xml:
<System>
<E01></E01>
<E02></E02>
<E03></E03>
</System>
注意::这是一个基于.NET Framework 4.7.1构建的Winforms应用程序
如果您对XML结构或读取文件的方式有任何特定要求,可以共享它们,我们将对此进行进一步讨论。
或者,您可以在Github上共享精简版的解决方案,以供其他人排除故障。
希望这会有所帮助!