WebClient抛出SocketException(无效的参数)

时间:2018-11-06 11:07:00

标签: c# .net webclient

我使用下面的代码来尝试创建文件到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)

4 个答案:

答案 0 :(得分:4)

基于Hans Passant的评论

  

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

我发现,就我的情况而言,问题是我的公司将解决方案存储在网络驱动器上。我最好的猜测是,由于底层安全措施,上传失败了,尽管我没有深入研究它,无法证明是这种情况。

在我的C盘上创建新的本地存储库解决了该问题。

因此,对于经验丰富的功能读者来说,建议是查看底层基础架构以解决该问题。

答案 1 :(得分:0)

WebClient.UploadFile Method。第二个参数是文件名。byte[]没有重载

尝试

webclient.UploadData(uri, xmlfilename);

答案 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 ()),并且我能够毫无问题地上传文件。

enter image description here

由于您尚未共享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上共享精简版的解决方案,以供其他人排除故障。

希望这会有所帮助!