2011-06-14 6 views
6

System.Net.WebClient 클래스로 작업하고 있는데 UploadFileAsync 메서드를 사용하여 파일을 업로드하려고합니다. Visual Studio 2010을 사용하고 있으며 모든 프로젝트가 클라이언트 라이브러리가 아닌 .NET 4.0 표준 런타임을 사용하도록 설정되어 있습니다.System.Net.WebClient.UploadFileAsync를 호출 할 때 .NET 오류가 발생합니다.

아래는 내가 사용하고있는 코드의 일부입니다. 약 90 %의 시간에 다음 오류가 발생합니다.

'System.ComponentModel.AsyncOperation'유형의 개체를 'UploadBitsState'유형으로 캐스팅 할 수 없습니다.

Stack Trace: 
at System.Net.WebClient.UploadFileAsyncWriteCallback(Byte[] returnBytes, Exception exception, Object state) 
at System.Net.WebClient.UploadFileAsync(Uri address, String method, String fileName, Object userToken) 
at FileUpload._StartUpload() 

내 조직 내부에 업로드하려고 오전 FTP 서버, 그러나 사람은 IPSwitches WS-FTP를 실행하고 다른 하나는 IIS 6.0 FTP 사이트를 실행하고, 나도 같은 문제에 경험이 두 서버.

나는 유사한 문제가없는 다른 사람들을 위해 높거나 낮은 것을 검색했습니다.

예외가 발생하는 실제 행은 _Client.UploadFileAsync 메서드 호출입니다.

private void _StartUpload() 
{ 
    try 
    { 
     _Client = new WebClient 
     { 
      Credentials = _Credentials 
     }; 
     _Client.UploadProgressChanged += ProgressChanged; 
     _Client.UploadFileCompleted += UploadCompleted; 
     _Client.UploadFileAsync(FileBeingUploaded, "STOR", _LocalFile, null); 
    } 
    catch (Exception exception) 
    { 
     // Methods calls removed for brevity 
    } 
} 

private void UploadCompleted(Object sender, UploadFileCompletedEventArgs e) 
{ 
    // Methods calls removed for brevity 
} 

private void ProgressChanged(object sender, UploadProgressChangedEventArgs e) 
{ 
    // Methods calls removed for brevity 
} 
+0

동 기적으로 실행하면 작동합니까? 'tcpdump' 나'WireShark'와 같은 패킷 스니퍼로 트래픽을 보려고 했습니까? –

+0

동기 호출을 시도하지 않았습니다. 스니퍼에 관해서는 이러한 특정 오류를 보려고하지는 않았지만 예외가 .Net 프레임 워크 내에 있고 캐스팅 문제이므로 TCP 트래픽 분석에서 어떤 결과가 나타날지 잘 모르겠습니다. –

+0

'_LocalFile' 파일을 정적 파일로 업로드하고 있습니까? 즉, ** 업로드되는 동안 수정되거나 업데이트되는 파일 내용의 ** ** 가능성이 있습니까? 나는 그 특정한 시나리오에서 당신의 오류를 복제 할 수 있기 때문에 물어 본다. –

답변

4

이것은 흥미로운 일입니다. 참조 소스 (WebClient.cs)를 살펴보면 UploadFileAsyncWriteCallback의 첫 번째 줄은 state 매개 변수를 UploadBitsState으로 캐스팅합니다.

catch (Exception e) 
{ 
    if (e is ThreadAbortException || e is StackOverflowException || e is OutOfMemoryException) 
    { 
     throw; 
    } 
    if(fs != null){ 
     fs.Close(); 
    } 
    if (!(e is WebException || e is SecurityException)) { 
     e = new WebException(SR.GetString(SR.net_webclient), e); 
    } 
    UploadFileAsyncWriteCallback(null, e, asyncOp); 
} 

asyncOp

유형 AsyncOperation이다 : 방법 UploadFileAsync에서

은, 읽고 몇 가지 예외 처리 코드가있다.

UploadFileAsyncWriteCallback에 대한 호출은 잘못된 유형의 객체를 콜백에 전달하기 때문에 버그입니다. 콜백은 C 스타일의 캐스트 (예 : UploadBitsState uploadState = (UploadBitsState)state;)입니다.

하지만 업로드하는 동안 무언가 예외가 발생하는 경우에만 발생합니다.

ProgressChanged 또는 UploadCompleted 이벤트 처리기의 어떤 것이 예외를 던질 가능성이 있습니까? 그 중 하나 또는 UploadFileAsync에 전달하는 매개 변수 중 하나가 잘못되었습니다.

더 많은 정보

UploadFileAsync에 버그가처럼 정말 볼 않습니다. 예를 들어, 다음은 InvalidCastException을 던집니다. 문서에 따르면 WebException을 던져야합니다.

var targetUri = new Uri("ftp://example.com/file.txt"); 
var srcFile = string.Empty; // documentation says this will throw WebException 
var client = new WebClient(); 
client.UploadFileAsync(targetUri, "STOR", srcFile, null); 

나는 이유 예외 코드에서 거짓말을 던져되고 있음을 말하고 싶지만 사물의 모습에서, https://connect.microsoft.com/VisualStudio/feedback/details/675575/webclient-uploadfileasync-throws-invalidcastexception 그러나

의 버그를보고했습니다. 죄송 합니다만 UploadFileAsync이 (가) 예외 정보를 잃어 가고 있기 때문에이라고 할 수 없습니다. 아마도 다른 누군가가 지적했듯이 동기 업로드를 시도하면 주제가 더 밝혀 질 것입니다.

+0

두 이벤트 핸들러 함수는 try {와 end with} catch (예외 예외) {// Handle exception}으로 시작하므로 그들이 부적절한 일을한다고 생각하지 않습니다. 위의 대답과 주석은 모두 문제를 일으키는 입력 매개 변수를 가리 킵니다. 뜻밖의 것이 값을 바꾸는 지 알아봐야 할 것입니다. –

+0

@DaleCouch : 죄송합니다. 업로드중인 디스크 드라이브의 실제 데이터 파일을 참조하고있었습니다. 예를 들어 다른 응용 프로그램의 로그 파일 인 경우 업로드하는 동안 다른 응용 프로그램이 계속 실행중인 경우 다른 응용 프로그램은 로그에 추가 로깅 데이터를 추가 할 수 있습니다. 이로 인해 Webclient가 200 바이트를 업로드한다고 생각하기 시작한 이후 Webclient가 혼동을 일으킬 수 있지만 파일이 이제 250 바이트 길이임을 알 수 있습니다. 그래도 내 모든 부분에 대한 모든 추측. –

+0

@ j.w.r .: 이제는 더 이해가가는 것 같습니다. 그것은 가능합니다. 이 파일들은 모두 실시간으로 생성되었으며, 전송하기 전에 파일을 닫았습니다. 따라서 OS가 따라 잡을 가능성이 매우 높습니다. 나는 그것이 어떻게 움직이는지를 바꾸려고 노력할 것이고 그것이 도움이되는지를 알 수있을 것이다. 가능한 방향에 고마워. –

관련 문제