[Mono-bugs] [Bug 478451] New: WebClient.UploadData throws "ProtocolViolationException" on FTP upload

bugzilla_noreply at novell.com bugzilla_noreply at novell.com
Sat Feb 21 05:46:57 EST 2009


           Summary: WebClient.UploadData throws
                    "ProtocolViolationException" on FTP upload
    Classification: Mono
           Product: Mono: Class Libraries
           Version: SVN
          Platform: 32bit
        OS/Version: Ubuntu
            Status: NEW
          Severity: Normal
          Priority: P5 - None
         Component: System
        AssignedTo: mono-bugs at lists.ximian.com
        ReportedBy: martijndijksterhuis at gmail.com
         QAContact: mono-bugs at lists.ximian.com
          Found By: ---

User-Agent:       Mozilla/5.0 (X11; U; Linux i686; en-US; rv:
Gecko/2008121622 Ubuntu/8.10 (intrepid) Firefox/3.0.5

Trying to upload an FTP file through the WebClient class results in an

[System.Net.ProtocolViolationException: Operation is not valid due to the
current state of the object at System.Net.FtpWebRequest.BeginGetRequestStream
(System.AsyncCallback callback, System.Object state) [0x00000]]

I have tried the code included below on Mono SVN (fails), Mono 1.9.1 (fails)
and Visual C# studio 2008 (succeeds) 

Reproducible: Always

Steps to Reproduce:
1.Use the code below to upload a file
2.Watch it fail with the above exception
Actual Results:  
System.Net.WebException: An error occurred performing a WebClient request. --->
System.Net.ProtocolViolationException: Operation is not valid due to the
current state of the object
  at System.Net.FtpWebRequest.BeginGetRequestStream (System.AsyncCallback
callback, System.Object state) [0x00000] 
  at System.Net.FtpWebRequest.GetRequestStream () [0x00000] 
  at System.Net.WebClient.UploadDataCore (System.Uri address, System.String
method, System.Byte[] data, System.Object userToken) [0x00000] 
  at System.Net.WebClient.UploadData (System.Uri address, System.String method,
System.Byte[] data) [0x00000] --- End of inner exception stack trace ---

  at System.Net.WebClient.UploadData (System.Uri address, System.String method,
System.Byte[] data) [0x00000] 
  at System.Net.WebClient.UploadData (System.Uri address, System.Byte[] data)
  at (wrapper remoting-invoke-with-check) System.Net.WebClient:UploadData
  at BasicFTPClientNamespace.BasicFTPClient.UploadData (System.String path,
System.Byte[] Data) [0x0001d] in
  at BasicFTPClientNamespace.BasicFTPClient.UploadFile (System.String ftppath,
System.String srcfile) [0x00056] in
  at BasicFTPClientNamespace.MainClass.Main (System.String[] args) [0x0002f] in

Expected Results:  
Successful upload of the file to the FTP server.

// Main.cs created with MonoDevelop
// User: martijn at 4:39 PM 2/18/2009
// To change standard headers go to Edit->Preferences->Coding->Standard Headers
using System;
using System.Net;
using System.IO;

namespace BasicFTPClientNamespace
  class BasicFTPClient
      public string Username;
      public string Password;
      public string Host;
      public int    Port;

      public BasicFTPClient()
          Username = "anonymous";
          Password = "anonymous at internet.com";
          Port     = 21;
          Host     = "";

       public BasicFTPClient(string theUser,string thePassword,string theHost)
          Username = theUser;
          Password = thePassword;
          Host = theHost;
          Port = 21;

      private Uri BuildServerUri(string Path)
          return new Uri(String.Format("ftp://{0}:{1}/{2}",Host,Port,Path));

      public byte[] UploadData(string path,byte[] Data)
          // Get the object used to communicate with the server.
          WebClient request = new WebClient();

          // Logon to the server using username + password
          request.Credentials = new NetworkCredential (Username,Password);
             return request.UploadData(BuildServerUri(path),Data);

      public byte[] UploadFile(string ftppath,string srcfile)
          // Read the data from disk
          FileStream fs = new FileStream(srcfile, FileMode.Open);
          byte [] FileData = new byte[fs.Length];

          int numBytesToRead = (int)fs.Length;
          int numBytesRead = 0;
          while (numBytesToRead > 0)
              // Read may return anything from 0 to numBytesToRead.
              int n = fs.Read(FileData, numBytesRead, numBytesToRead);

              // Break when the end of the file is reached.
              if (n == 0) break;

              numBytesRead += n;
              numBytesToRead -= n;
          numBytesToRead = FileData.Length;

          // Upload the data from the buffer
          return UploadData(ftppath,FileData);


  class MainClass
            public static void Main(string[] args)
         BasicFTPClient MyClient = new BasicFTPClient();


          catch (Exception e)


Configure bugmail: https://bugzilla.novell.com/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the QA contact for the bug.
You are the assignee for the bug.

More information about the mono-bugs mailing list