2010-04-11 4 views
3

내 ASP 프로젝트에서 내 기본 페이지는 내부적으로 다운로드 한 다음 처리해야하는 매개 변수로 URL을받습니다. WebClient의 DownloadFile 메서드를 사용할 수 있지만 악의적 인 사용자가 내 서버에서 불필요한 트래픽을 발생시키는 거대한 파일에 대한 URL을 제공하지 못하도록하고 싶습니다. 이를 피하기 위해 DownloadFile에서 다운로드 할 수있는 최대 파일 크기를 설정하는 솔루션을 찾고 있습니다. 제한된 WebClient DownloadFile 최대 파일 크기

는 플래시 나 실버 라이트 파일 업로드 컨트롤을 사용하지 않고이 '깔끔하게'을 할 수있는 방법은 없습니다, 사전에

+0

최대 다운로드 또는 최대 업로드 내에있는 경우 – Aristos

+0

@Aristos - 최대 다운로드에 대해 이야기하고 있습니다. My asp .net 페이지는 전달 된 URL을 다운로드합니다. –

답변

7

을 주셔서 감사합니다. 이러한 방법을 사용하지 않고 할 수있는 최선의 방법은 web.config 파일에 maxRequestLength을 설정하는 것입니다.

예 :

<system.web> 
    <httpRuntime maxRequestLength="1024"/> 

위 예 1메가바이트에 대한 파일 크기를 제한한다. 사용자가 더 큰 것을 보내려고하면 최대 요청 길이를 초과했다는 오류 메시지가 표시됩니다. 그래도 예쁜 메시지는 아니지만 원하는 경우 IIS의 오류 페이지를 무시하여 사이트와 일치시킬 수 있습니다. DUE

편집 댓글에 :

그래서 아마 그래서이 개 가능한 솔루션을 게시 할 예정 URL에서 파일을 얻을 수있는 요청을 수행하는 방법의 몇 가지를 사용하여. 먼저 .NET WebClient을 사용하고 있습니다 :

HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(new Uri("http://www.somewhere.com/test.txt")); 
webRequest.Credentials = CredentialCache.DefaultCredentials; 
HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 
Int64 fileSize = webResponse.ContentLength; 
if (fileSize < iMaxNumberOfBytesToAllow) 
{ 
    // Download the file 
} 

희망 이러한 솔루션 중 하나 돕거나 : 다른 방법은 바로 파일 크기를 확인하기 위해 다운로드를하기 전에 기본적인 웹 요청을 할 수 있었다

// This will get the file 
WebClient webClient = new WebClient(); 
webClient.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(DownloadCompleted); 
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged); 
webClient.DownloadFileAsync(new Uri("http://www.somewhere.com/test.txt"), @"c:\test.txt"); 

private void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    WebClient webClient = (WebClient)(sender); 
    // Cancel download if we are going to download more than we allow 
    if (e.TotalBytesToReceive > iMaxNumberOfBytesToAllow) 
    { 
     webClient.CancelAsync(); 
    } 
} 

private void DownloadCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e) 
{ 
    // Do something 
} 

최소한 올바른 방향으로 가십시오. bytesTotal이 제한

+0

@Kelsey - 당신의 대답은 무관합니다. 질문을 다시 읽으십시오. –

+0

@Jack Juiceson - URL을 가져 오는 데 사용하는 방법은 무엇입니까? 라이브러리를 사용하여 파일 스트리밍을 처리하고 있습니까? – Kelsey

+0

재 편집을 해주셔서 감사합니다. DownloadProgressChanged를 사용한 첫 번째 솔루션은 내가 함께 갈 것입니다. 이것이 제가 찾고 있던 것입니다. 첫 번째 요청을 제안하는 두 번째 솔루션에 관해서는, 항상 콘텐츠 길이 헤더가 서버에 의해 제공되는 것은 아니기 때문에, 나는 그것을 사용하지 않을 것이다. –

1
var webClient = new WebClient(); 
client.OpenRead(url); 
Int64 bytesTotal = Convert.ToInt64(client.ResponseHeaders["Content-Length"]); 

은 그런 결정?