비동기식이며 AJAX 비동기 요청을 통해 파일 진행 상황에 대한 업데이트를 제공 할 수있는 C# 파일 업로드 처리기를 만들려고합니다. 기본적으로 요청이 POST 인 경우 세션에 정보를로드 한 다음 요청이 GET 인 경우 업로드의 현재 상태 (업로드 된 바이트, 총 바이트 등)를 반환합니다. 나는 그것이 비동기 핸들러가 될 필요가 있다는 것을 완전히 확신하지는 않지만, 파일이 꽤 클 수 있기 때문에 가장 잘 작동 할 것이라고 생각했다. 기본 비동기 처리기의 경우 처리기와 매우 비슷한 내용을이 MSDN article에 사용했습니다. 아래 코드의 일부 핵심 섹션을 게시했습니다. 내가 가지고있는 문제는 POST가 완료 될 때까지 GET 정보를받지 못한다는 것입니다. 이 예에서는 GET 요청에 jQuery을 사용하고 파일을 게시하는 데는 BlueImp을 사용합니다.ASP.Net 비동기 HTTP 파일 업로드 처리기
HTML과 자바 스크립트는 비동기 프로세스 요청 방법은
<input id="somefile" type="file" />
$(function() {
name = 'MyUniqueId130';
var int = null;
$('#somefile').fileupload({
url: '/fileupload.axd?key='+name,
done: function (e, data) { clearInterval(int); }
});
$('#somefile').ajaxStart(function(){
int = setInterval(function(){
$.ajax({
url: '/fileupload.axd?key='+name,
dataType: 'json',
async: true
})
.done(function(e1, data1){
if(!e1.InProgress || e1.Complete || e1.Canceled)
clearInterval(int);
});
}, 10000)});
});
을 그것이 POST가인지 정확한 메소드를 호출하거나 다음 요청 종료 CompleteRequest를 호출하여 다음 중 하나에 GET
:private static void GetFilesStatuses(HttpContext context)
{
string key = context.Request.QueryString["key"];
//A dictionary of <string, UploadStatus> in the session
var Statuses = GetSessionStore(context);
UploadStatus ups;
if (!String.IsNullOrWhiteSpace(key))
{
if (Statuses.TryGetValue(key, out ups))
{
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.Write(CreateJson(ups));
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.NotFound;
}
}
else
{
context.Response.StatusCode = (int)HttpStatusCode.OK;
context.Response.Write(CreateJson(Statuses.Values));
}
}
private static void UploadFile(HttpContext context)
{
var Statuses = GetSessionStore(context);
string key = context.Request.QueryString["key"];
if (String.IsNullOrWhiteSpace(key))
{
context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
return;
}
HttpPostedFile file = context.Request.Files[0];
string extn = file.FileName.LastIndexOf('.') == -1 ? "" :
file.FileName.Substring(file.FileName.LastIndexOf('.'), (file.FileName.Length - file.FileName.LastIndexOf('.')));
string temp = GetTempFileName(path, extn);
UploadStatus status = new UploadStatus()
{
FileName = file.FileName,
TempFileName = temp,
Path = path,
Complete = false,
Canceled = false,
InProgress = false,
Success = true,
BytesLoaded = 0,
TotalBytes = file.ContentLength
};
Statuses.Add(key, status);
byte[] buffer = new byte[bufferSize];
int byteCount = 0;
using (var fStream = System.IO.File.OpenWrite(context.Request.MapPath(path + temp)))
{
uploads.Add(status);
while ((byteCount = file.InputStream.Read(buffer, 0, bufferSize)) > 0 && !status.Canceled)
{
status.InProgress = true;
status.BytesLoaded += byteCount;
fStream.Write(buffer, 0, byteCount);
}
status.Complete = !status.Canceled;
status.InProgress = false;
status.Success = true;
if (status.Canceled)
{
Statuses.Remove(temp);
}
context.Response.StatusCode = (int)HttpStatusCode.OK;
}
}
을
비동기 핸들러, 비동기 핸들러와 같은 많은 것들을 시도해 보았습니다. JavaScript가 비동기로 실행되고 있는지 확인하고 있지만,이 시점에서 나는 다른 사람들이 문제를 해결해야한다고 생각합니다. 아무도 도와 줄 수있어서 고맙습니다.
누군가이 문제를 겪는 경우 정적 ConcurrentDictionary를 만들었고 while 루프 안에 TryUpdate를 추가하여 상태를 업데이트했습니다.이것은 대부분의 문제를 해결했지만 BlueImps beforeSend 함수를 사용하여 비동기 요청을 시작하도록 자바 스크립트를 변경했습니다. – ars265