使用UploadFileAsync为上载API创建负载测试程序

本文关键字:创建 负载 测试程序 API 上载 UploadFileAsync 使用 | 更新日期: 2023-09-27 18:28:29

我在这里要做的是看看这个API每秒能处理多少请求。我正在尝试在控制台应用程序中使用API,该应用程序最终将是一次性代码。我的想法是制作一个for循环,尝试每2秒上传一个xml文档。我以前从未做过这种事,所以请原谅我的无知。这是我的主要方法:

    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.dll 中发生类型为"System.Reflection.TargetInvocationException"的未处理异常

在做了一些研究之后,显然我不能在不提示的情况下调用API方法(返回异步任务)。不幸的是,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;
    }

我是不是完全错了?我想做的事情可行吗?

使用UploadFileAsync为上载API创建负载测试程序

在我看来,以下方法在您的场景中会更好地工作:

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与较新的async/await混合匹配似乎没有成效。最好只是用异步/await兼容的代码包装API的同步版本。

(请注意,在我看来,您还可以调用Thread.Sleep(2000),而不是创建一个新的延迟任务来等待,但以上操作也应该可以)。