Что я пытаюсь сделать здесь, это посмотреть, насколько этот API может обрабатывать в отношении запросов в секунду. Я пытаюсь использовать API в консольном приложении, которое в конечном итоге будет выброшенным кодом. Моя идея состояла в том, чтобы создать цикл for, который попытался бы загрузить XML-документ каждые 2 секунды. Я никогда этого не делал, прежде чем простить мое невежество. Вот мой Основной метод:Создание тестера загрузки для API загрузки с UploadFileAsync
static void Main()
{
RunAsync().Wait();
}
И метод RunAsync:
static async Task RunAsync()
{
Uri apiUrl = new Uri("http://apiurl.com/upload/files/uploadfiles");
const string file = @"C:\simple.xml";
WebClient client = new WebClient();
for (int i = 0; i <= 100; i++)
{
client.UploadFileCompleted += FileUploadSuccess;
client.UploadFileAsync(apiUrl, file);
await Task.Delay(2000);
Console.WriteLine("Upload waiting 2 seconds...");
}
Console.WriteLine("Loop completed.");
}
И методы успеха:
private static void FileUploadSuccess(object sender, UploadFileCompletedEventArgs e)
{
string reply = System.Text.Encoding.UTF8.GetString(e.Result);
Console.WriteLine("The file result was: {0}", reply);
}
Он бросает исключение на основе впервые на e.Result. Вот исключение:
Необработанное исключение типа «System.Reflection.TargetInvocationException» произошло в System.dll
После выполнения некоторых исследований, по-видимому, я не могу вызвать метод API (который возвращает async Task), не ожидая этого. К сожалению, похоже, UploadFileAsync не «ждет».
Вот метод API:
public async Task<HttpResponseMessage> UploadFiles()
{
var pilotTokenObject = TokenHelper.CreatePilotTokenObject(Request);
byte[] fileBuffer = null;
HttpResponseMessage retVal = null;
if (pilotTokenObject != null)
{
var content = Request.Content;
if (content == null)
{
throw new PilotApiException("Empty request content", HttpStatusCode.NoContent);
}
if (!content.IsMimeMultipartContent())
{
throw new PilotApiException("Request does not contain not multi-part content");
}
var uploadModelController = new PilotUploadModelController();
//*SAVE STREAMED FILE*
string serverSavePath = ConfigurationManager.AppSettings["PilotUploadApiTempStoragePath"];
if (!Directory.Exists(serverSavePath))
Directory.CreateDirectory(serverSavePath);
var provider = new MultipartFormDataStreamProvider(serverSavePath);
await Request.Content.ReadAsMultipartAsync(provider);
var fileData = provider.FileData;
if (fileData == null || fileData.Count == 0)
{
throw new PilotApiException("No multipart/form file data present.");
}
bool uploaded = false;
//Loop through each file
fileData.ForEach((fileRequest) =>
{
if (RetryUntilFileReadable(Path.Combine(serverSavePath, fileRequest.LocalFileName), 1000, 5))
{
var fileHeader = fileRequest.Headers;
if (fileHeader != null && fileHeader.ContentDisposition != null)
{
var fileName = fileHeader.ContentDisposition.FileName.Replace("\"", "");
var fileBytes = File.ReadAllBytes(Path.Combine(serverSavePath, fileRequest.LocalFileName));
//Save File to DB
var upload = uploadModelController.UploadHelper
.AddUploadFileToDb(pilotTokenObject.CentralUserDbUserId, pilotTokenObject.ClientIp, pilotTokenObject.UserAgentString,
UploadEnums.UploadKind.PilotUploadApi, fileName, fileBytes.Length, fileBytes,
UploadEnums.EncryptionType.None);
if (upload != null)
uploaded = true;
}
}
});
if (uploaded)
{
retVal = Request.CreateResponse(HttpStatusCode.Accepted, new
{
Response = String.Format("file uploaded successfully.")
});
}
}
return retVal;
}
Am Я буду об этом совершенно неправильно? Это то, что я хочу сделать даже выполнимо?
Каков ваш метод Web Api? –
Добавлен метод API – joelforsyth
Хорошо, чтобы уточнить, ваш API не возвращает задачу вашему клиенту. Он возвращает строку, которая является частью HttpResponseMessage. Таким образом, ваш клиент не знает, что его HttpResponseMessage завернут в задачу. «Ожидание» строго зависит от вашего метода API. Вы пробовали обернуть свою логику API в try/catch и посмотреть, получите ли вы исключение при первом вызове? –