2014-10-29 2 views
0

Что я пытаюсь сделать здесь, это посмотреть, насколько этот 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 Я буду об этом совершенно неправильно? Это то, что я хочу сделать даже выполнимо?

+0

Каков ваш метод Web Api? –

+0

Добавлен метод API – joelforsyth

+0

Хорошо, чтобы уточнить, ваш API не возвращает задачу вашему клиенту. Он возвращает строку, которая является частью HttpResponseMessage. Таким образом, ваш клиент не знает, что его HttpResponseMessage завернут в задачу. «Ожидание» строго зависит от вашего метода API. Вы пробовали обернуть свою логику API в try/catch и посмотреть, получите ли вы исключение при первом вызове? –

ответ

1

Мне кажется, что следующее будет работать лучше в вашем сценарии:

byte[] response = await Task.Run(() => client.UploadFile(apiUrl, file)); 
string reply = System.Text.Encoding.UTF8.GetString(response); 
Console.WriteLine("The file result was: {0}", reply); 
Console.WriteLine("Upload waiting 2 seconds..."); 
await Task.Delay(2000); 

Попытки смешивать и соответствовать старшему асинхронному API с новым асинхронным/ОЖИДАНИЕМ не представляется плодотворным в этом случае , Лучше всего обернуть синхронную версию API с помощью кода, совместимого с aync/await.

(Обратите внимание, что мне кажется, что вы можете просто позвонить Thread.Sleep(2000) вместо того, чтобы создавать новую задачу ожидания, чтобы ждать, но вышеизложенное тоже должно работать нормально).

+0

«Ответ» должен быть «результатом»? В противном случае ответ не используется, и результат не объявляется. – joelforsyth

+0

да, извините ... крепление. :) –

+0

Спасибо, это сработало! – joelforsyth

Смежные вопросы