2010-08-13 3 views
0

파일을 다운로드 할 웹 서비스가 있습니다. 들어오는 요청이있을 때마다, 다운로드하도록 요청 된 파일의 체크섬과 타임 스탬프와 서버의 파일을 확인합니다. 동일한 경우에는 다시 다운로드하지 않아도됩니다.HTTP 요청 헤더의 체크섬 포함

서버 측의 코드는 다음과 같습니다

클라이언트 측에
string checksum; //calculate this using methods in System.Security.Cryptography 
string timestamp = File.GetLastAccessTimeUtc(filename).ToString(); 

string incCheckSum = WebOperationContext.Current.IncomingRequest.Header["If-None-Match"]; 
string incTimestamp = WebOperationContext.Current.IncomingRequest.Header["If-Modified-Since"]; 

if(checksum == incCheckSum && timestamp == incTimeStamp) 
{ 
    WebOperationContext.Current.OutgoingResponse.StatusCode = HttpStatusCode.NotModified; 
    return null; 
} 

WebOperationContext.Current.OutgoingResponse.Headers["Last-Modified"] = timestamp; 
WebOperationContext.Current.OutgoingResponse.Headers["ETag"] = checksum; 
return FileStream("Filename",FileMode.Open, FileAccess.Read,FileShare.Read); 

:

HttpWebRequest request = (HttpWebRequest)WebRequest.create("http://somewebsite.com"); 
request.Header["If-None-Match"] = //get checksum file on the disk 
request.Header["If-Modified-Since"] = "Last Modified Time" // I get an exception here: 

예외는 말한다는

"헤더는 적절한를 사용하여 수정해야합니다 속성 "

은 그 때 나는

request.IfModifiedSince = //Last Access UTC time of the file 

지금,이 변화는 문제를 야기 할. 요청이 서버에 도착할 때마다 마지막 액세스 시간은 항상 다른 형식이며 일치하지 않습니다. 따라서 파일의 마지막 수정 시간이 2010 년 8 월 13 일 5:27:12 PM 일 경우 서버 측에서 [ "If-Modified-Since"] 값이 "Fri, 13 Aug 2010 17:27:12"이됩니다. GMT "

어떻게 해결할 수 있습니까?

내가 피들러를 사용하고 다음 "요청 헤더"를 추가

If-Modified-Since= last access time 
If-None-Match= checksum 

이 잘 작동합니다.

답변

0

비교할 수있는 DateTime 개체로 두 문자열을 모두 읽거나 날짜 문자열이 같은 형식인지 확인할 수 있습니다. 서버 측에

:

string timestamp = File.GetLastAccessTimeUtc(filename).ToString("yyyy-MM-dd HH:mm:ss"); 

string incTimestamp = WebOperationContext.Current.IncomingRequest.IfModifiedSincee.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss"); 

또한 ToString을 삭제하고 날짜 시간 개체를 직접 비교할 수 있습니다.

+0

나는 클라이언트 측의 변경 사항을 완전히 이해하지 못했습니다. request.IfModifiedSince.ToUniversalTime(). ToString ("yyyy-MM-dd HH : mm : ss") = File .GetLastAccessUtc (filename) – Adam

+0

서버와 클라이언트에 관해 완전히 이해하기 위해 질문을 다시 읽어야했지만 지금 내 대답이 해결 된 것 같습니다. 이제 서버는 파일 날짜와 헤더 날짜를 동일한 형식으로 요청과 비교합니다. –

0

서버 쪽에서; 당신은 헤더의 형식을 제어하고 있습니다; 날짜에서 문자열을 작성한 다음이를 요청 헤더 필드에 명시 적으로 지정하기 때문입니다. 이를 클라이언트가 설정 한 헤더와 일치하도록 올바르게 형식화해야합니다.

IfModifiedSince 속성은 헤더 값을 올바른 형식으로 설정합니다. HTTP 사양에 따라 see section 3.3 here

+0

여전히 나에게 불명확 한 점은 : "If-Modified-Since"라는 요청 헤더와 그 문자열 값을 언급하면 ​​Fiddler가이 값을 정확하게 설정하지만 문자열 값으로 설정할 수 없다는 것입니다. – Adam