2010-02-16 7 views
5

zip 파일을 ftp 서버에 업로드하는 코드를 작성하고 있습니다. 놀랍게도 코드는 작은 파일에서는 잘 작동하지만 큰 파일에서는 문제가 발생합니다. Stream 객체를 사용하고 있는데 스트림 (큰 파일에만 해당)을 닫으려고 할 때 코드가 멈추는 것으로 나타났습니다. 큰 파일 일지라도 스트림을 닫지 않으면 코드가 제대로 실행됩니다. 아무도 왜 이런 일이 일어나고 있는지에 대한 논리를 보지 못합니다. 그리고 스트림을 닫지 않으면 미래에 문제가 될 수도 있습니다..NET을 사용하여 FTP 업로드

코드 추출물 :

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name)); 
Stream strm = reqFTP.GetRequestStream(); 

코드는 (업로드 파일이 큰 경우) 응답을 중지에서이 부분은 시도 - 캐치 내에있는

strm.Close(); 

도 예외가 없습니다.

스택 추적을 얻는 방법을 모르겠습니다.

+1

어떻게 FtWebRequest 클래스를 사용하고 있습니까?모든 FTP 서버 또는 그 중 하나만 사용해야합니까? –

+1

"결국 문제가되는"것은 무엇을 의미합니까? 특정 스택 추적 또는 잘못된 동작을 게시 할 수 있습니까? – abc

+0

죄송합니다. 누군가 내 질문을 편집 한 경우 다시 시도해 주실 수 있습니까? – kobra

답변

6

스트림을 닫을 때 어떤 오류가 발생했는지 구체적으로 알 수는 없지만 Google 애플리케이션에서는 대용량 파일 업로드 (비디오 및 이미지)를 많이합니다. 우리는 우리의 FTP 스트림에 작성하는 방법은 다음과 같습니다

request.KeepAlive = false; // This eliminated some of our stream closing problems 

using (Stream stream = request.GetRequestStream()) 
{ 
    stream.Write(file.Data, 0, file.Data.Length); 
} 

가 나는 using 블록을 수행하는 것이 효율적 자체에 Close 전화를 할 것이라고 생각하지만, 어쩌면 다른 필요한 정리를 수행합니다. 또한 내가 FTP 킵 얼라이브 (keepalives)를 끄는 것을 보았습니다. 우리가 업로드 한 써드 파티 FTP 사이트 중 일부에서 문제가 발생했습니다.

모든 예외를 삼키기보다는받은 특정 예외를 실제로 확인해야합니다. 오류 메시지는 무엇이 잘못되었는지 알려줍니다. 우리가 직면 한 가장 일반적인 문제는 능동 대 수동 모드와 keepalives와 관련이있었습니다.

편집 :

, 우리는 때때로 우리의 응용 프로그램에서 추적을 설정했다 정말로 우리가 CDN 서비스와 FTP 문제를했을 때에가는 (그리고 너무 자주 발생) 된 것을 발견 할 수 있습니다. 추적을 사용하는 방법에 대한 자세한 내용은 this link을 참조하십시오. 또 다른 옵션은 Wireshark와 같은 도구를 사용하여 응용 프로그램과 FTP 서버 간의 대화를 스니핑하는 것입니다. FTP 프로토콜에서 어떤 일이 벌어지는지를 볼 수 있다면 문제를 해결할 수있는 기회가 훨씬 더 많을 것입니다.

+0

감사합니다. 내 코드에서 KeepAlive는 false이고 "using"을 시도했지만 코드는 "using"블록에서 나오지 않습니다. 오류와 관련해서는 예외가 없으므로 문제를 추적하기가 어렵습니다. – kobra

+0

활성 또는 수동 모드를 사용하고 있습니까? – Jacob

+0

그리고 "이 부분이 try-catch 안에 있기 때문에 예외는 없습니다"라고 말하면 catch 블록에 도달하지 못했거나 try/catch가 예외를 마스킹한다고 말하는 것입니까? – Jacob

0

here에서 오픈 소스 FTP 구성 요소를 시험해 볼만한 가치가있을 수 있습니다. FtpWebRequest를 사용하여 시도해 보았습니다. 사용 경험이 저조했습니다 ... 천천히, 시간이 초과되었습니다. 매우 자연 스럽기 때문에 야곱 지적 같이하는 FtpWebRequest가 ... 포트 80 대신 좀 더 다양하고 강력한,이 FTP 구성 요소를 사용하는 경우 21 이 ... 상황이 매우 극적으로 변화 기본 포트를 통해 작동

편집 내 명백한 오류와 무언가를 믿게하는 FtpWebRequest 클래스의 비논리적 인 견해 펑키하고 이상한 일이 벌어지고 있었고, HTTP를 통해 어떻게 든 진행되고있었습니다 ... Jacob은 요점이 있어야합니다 ... 프레임 워크 내에서 잘못된 명명 규칙의 고전적인 사례 ... 감사합니다 Jacob!

호프가 도움이 되었으면 안녕하세요, 탐.

+0

FtpWebRequest는 포트 80을 사용한 적이 없습니다. 이 정보는 어디서 얻습니까? – Jacob

+0

@Jacob : FtpWebRequest라고하는 이유는 ... http 프로토콜을 사용하여 FTP 서버와 통신 중입니다 ... 키워드가 이름에 있습니다 !! WebRequest를 사용하여 FtpWebRequest를 만드는 이유는 무엇입니까? 당신이 동의하지 않는다면 포트 21과 직접 통신하는 전용 FTP 구성 요소가없는 이유는 무엇입니까? 이 WebRequest 클래스를 둘러 쌉니다 ... – t0mm13b

+2

그것은 나쁜 이름입니다. HttpWebRequest는 포트 80을 사용하고 FtpWebRequest는 포트 21을 사용합니다. WebRequest는 둘 다에 대한 추상 기본 클래스입니다. – Jacob

관련 문제