2014-07-17 1 views
1

Я пытаюсь загрузить файл с FTP-сайта в Basecamp с использованием Basecamp API. Я использую простое консольное приложение. Вот мой код:WebClient.UploadData «Основное соединение было закрыто»

Try 
    Dim accountID As String = ConfigurationManager.AppSettings("BaseCampID") 
    Dim projectID As Integer = 9999999 
    Dim folderName As String = "XXXXX/XXXXX" 
    Dim fileName As String = "XXX.zip" 

    'The URL to access the attachment method of the API 
    Dim apiURL = String.Format("https://basecamp.com/{0}/api/v1/projects/{1}/attachments.json", accountID, projectID) 

    'Get the file from the FTP server as a byte array 
    Dim fileBytes As Byte() = GetFileBytes(String.Format("{0}\\{1}", folderName, fileName)) 

    'Initialize the WebClient object 
    Dim client As New WebClient() 
    client.Headers.Add("Content-Type", "application/zip") 
    'Need to provide a user-agent with a URL or email address 
    client.Headers.Add("User-Agent", "Basecamp Upload ([email protected])") 
    'Keep the connection alive so it doesn't close 
    client.Headers.Add("Keep-Alive", "true") 

    'Provide the Basecamp credentials 
    client.Credentials = New NetworkCredential("username", "password") 

    'Upload the file as a byte array to the API, and get the response 
    Dim responseStr As Byte() = client.UploadData(apiURL, "POST", fileBytes) 

    'Convert the JSON response to a BaseCampAttachment object 
    Dim attachment As BaseCampAttachment 
    attachment = JSonHelper.FromJSon(Of BaseCampAttachment)(Encoding.Default.GetString(responseStr)) 

Catch ex As Exception 
    Console.WriteLine(ex.Message) 
Finally 
    Console.ReadLine() 
End Try 

Но всякий раз, когда он звонит client.UploadData, я получаю сообщение об ошибке «Базовое соединение закрыто: соединение было закрыто неожиданно.» Я столкнулся с этим вопросом раньше и решил, что решил его, добавив заголовок «Keep-Alive», но он больше не работает. API работает, если я загружаю локальный файл с client.UploadFile, но я бы хотел просто загрузить файл из байтового массива с FTP, а не загружать файл локально, а затем загружать его в Basecamp.

Любые мысли были бы весьма благодарны. Благодаря!

+0

Итак, вы говорите, что приведенный выше код работает, когда вы запускаете его на своем компьютере, но не при запуске его с FTP-сервера? Получаете ли вы какие-либо конкретные коды ответа HTTP или сообщения, отличные от закрытия соединения? – mclark1129

+0

Он работал на моей машине раньше дня, но в какой-то момент он начал получать сообщение закрытого соединения на моей машине. Я не видел других кодов ответа HTTP, кроме закрытого соединения. – Jarod

ответ

1

Я никогда не выяснял, что случилось с вызовом WebClient, но я закончил использование обертки API Basecamp от https://basecampwrapper.codeplex.com. Эта оболочка использует HTTPRequest и HTTPResponse вместо WebClient.UploadData. Также гораздо проще просто использовать эту оболочку, чем пытаться написать собственный код с нуля.