【问题标题】:WebClient throws SocketException (Invalid argument)WebClient 抛出 SocketException(无效参数)
【发布时间】:2018-11-06 11:07:00
【问题描述】:

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

【问题讨论】:

  • @mjwills 提供的参数无效。也更新了我的问题。
  • 如果您希望人们提供帮助,请发布实际代码和相应的完整异常。
  • 这是一个非常低级的事故,与您传递的参数无关,因为它们直到以后才被使用。底层 OS 功能 (WSASocket) 失败,似乎对创建 TCP 套接字不满意。这当然不应该发生。但是网络代码会发生垃圾,总是有太多的垃圾挂在一个声称可以保证你的机器安全和平稳运行的套接字上。首先禁用已安装的反恶意软件产品,然后禁用任何类型的防火墙等等。
  • 在不知道导致此事故的实际恶意软件的情况下,我无法正确回答这个问题。这样的细节对未来的受害者来说非常重要。请创建您自己的帖子以分享您的发现并将其标记为答案。
  • @HansPassant 我明白这一点。回答了我自己的问题,但很想将赏金分配给您。如果您提供任何类型的答案,我会这样做。

标签: c# .net webclient


【解决方案1】:

根据 Hans Passant 的评论

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

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

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

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

【讨论】:

    【解决方案2】:

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

    试试这个

    webclient.UploadData(uri, xmlfilename);
    

    【讨论】:

    • 你是对的,但这将是编译器错误,而不是运行时错误。这意味着 OP 没有提供minimal reproducible example,并且您的回答不会解决手头的问题。
    • UploadData 确实接受 byte[] 作为第二个参数。我认为您不小心查看了UploadFile 的文档(链接)。
    • it Returns Byte[] 一个 Byte 数组,包含来自资源的响应体。byte[] 没有重载
    • @AzarShaikh 您链接了UploadFile() 文档。我也尝试了这个函数(使用文件的绝对路径),但它引发了同样的错误。 UploadData() 接受 byte[]
    • @MarkBaijens 再试一次 webclient.Credentials = new NetworkCredential("******", "*********");webclient.UploadFile("yourftp ", "文件名");
    【解决方案3】:

    您的 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);
    

    【讨论】:

    • 我也尝试过这种方法,在我的问题中提到了它。它给出了相同的结果。
    【解决方案4】:

    我只是按原样尝试了您的代码,除了一项更改(读取 XML 文件并将其转换为 byte[]),我能够毫无问题地上传文件。

    由于您尚未共享您的 XML 结构或您用于读取 XML 并将其转换为 byte[] 的方法,因此我选择了 最简单的 XML 形式out-of- .NET中的the-box方法读取文件数据并将其转换为byte[]

    这是 source.xml 文件中的 XML 文本:

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

    这是我在 ftp 服务器上读取-转换-上传 source.xml 的代码:

            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);
    

    注意:这是基于 .NET Framework 4.7.1 构建的 Winforms 应用程序

    如果您对 XML 结构或读取文件的方式有任何特定要求,您可以分享相同的内容,我们可以进一步讨论。

    或者,您可以在 Github 上分享您的解决方案的精简版本,以便其他人解决问题。

    希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2015-04-26
      • 1970-01-01
      • 2012-05-01
      • 2019-02-26
      • 2019-01-25
      • 1970-01-01
      • 2013-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多