首页 > 解决方案 > 如何在 .NET WEB API 中处理多个请求

问题描述

我正在使用 post 方法控制器实现 .NET WEB API 项目。

namespace MockWebAPI_with_JWT.Controllers
{
    public class CustomerController : ApiController
    {

        #region GetNonce
        [RequiredAttributes]
        [HttpPost]
        public IHttpActionResult GetNonce([FromBody] JObject customer)
        {
            var customerResponse = new CustomerResponse { };
            HttpResponseMessage responseMsg = new HttpResponseMessage();
            HttpClient httpClientforNonce = new HttpClient();
            dynamic custReq = customer;
            dynamic newReq = new JObject();
            IHttpActionResult response = null;

            if (custReq == null)
            {
                customerResponse.responseMsg.StatusCode = HttpStatusCode.BadRequest;
                response = ResponseMessage(customerResponse.responseMsg);
                return response;
            }
            //Customer Information from Self signed certificate
            CertificateValidation certificateValidation = new CertificateValidation();
            X509Certificate2 clientCertforCustomer = Request.GetClientCertificate();
            string custID = certificateValidation.CustomerInfoFromClientCert(clientCertforCustomer);
           
          //  newReq.id = custReq.id;
            newReq.id = custID;
            newReq.mpn = custReq.mpn;
            newReq.manufacturer =custReq.manufacturer;
            newReq.commands = new JArray();
            // newReq.commands = custReq.commands;

            bool isCustomerIdValid = false;
            bool custAuthorized = false;
            dynamic custCommand = null;
            MockWebAPI_with_JWT.ProxyAPIService.CustomerInfo customerDetails = new MockWebAPI_with_JWT.ProxyAPIService.CustomerInfo();
            ProxyService proxyService = new ProxyService();
            proxyService.Url = "http://proxyapiwebservicetest.micron.com/ProxyService.svc";
           // MockWebAPI_with_JWT.ProxyAPIService.CustomerInfo customers = proxyService.GetCustomerInfo(custReq.id.ToString());
            MockWebAPI_with_JWT.ProxyAPIService.CustomerInfo customers = proxyService.GetCustomerMPNInfo(custID, custReq.mpn.ToString());

           // if (customers.CustomerID == custReq.id.ToString())
            if (customers.CustomerID == custID && customers.CustomerMPN == custReq.mpn.ToString())
            {
                
                isCustomerIdValid = true;
               // customerDetails = proxyService.GetCustomerCommands(custReq.id.ToString());
                customerDetails = proxyService.GetMPNCommands(custReq.mpn.ToString());
                foreach (var commandItem in customerDetails.Cust_Commands)
                {
                    custCommand = new JObject();
                    custCommand.command = commandItem.CommandName;
                    if (commandItem.CommandName.Contains("Nonce"))
                    {
                        custAuthorized = true;
                    }
                    custCommand.commandExp = (Int32)(DateTime.UtcNow.AddMonths(1).Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
                    newReq.commands.Add(custCommand);
                }
            }
            // if credentials are valid, create JWT
            if (isCustomerIdValid && custAuthorized)
            {
                TokenGenerator keyProv = new TokenGenerator();
                string token = keyProv.GenerateToken(newReq, "GetNonce");

                if (string.IsNullOrEmpty(token))
                {
                    customerResponse.responseMsg.StatusCode = HttpStatusCode.BadRequest;
                    response = ResponseMessage(customerResponse.responseMsg);
                    return response;
                }
                else
                {   //call Rambus method - GET Nonce  
                    RequestHandler reqHandler = new RequestHandler();
                    string result = "";
                    result = reqHandler.SendGetRequestToKMS(newReq, token, "Nonce");

                    if (!string.IsNullOrEmpty(result))
                    {
                        string[] strResponse = result.Split('|');
                        if (strResponse[0].ToUpper() == "OK")
                        {
                            customerResponse.responseMsg.StatusCode = HttpStatusCode.OK;
                        }
                        else if (strResponse[0].ToUpper() == "UNAUTHORIZED")
                        {
                            customerResponse.responseMsg.StatusCode = HttpStatusCode.Unauthorized;
                        }
                        else if (strResponse[0].ToUpper() == "BADREQUEST")
                        {
                            customerResponse.responseMsg.StatusCode = HttpStatusCode.BadRequest;
                        }
                        else if (strResponse[0].ToUpper() == "INTERNALSERVERERROR")
                        {
                            customerResponse.responseMsg.StatusCode = HttpStatusCode.InternalServerError;
                        }
                        else
                        {
                            customerResponse.responseMsg.StatusCode = HttpStatusCode.BadRequest;
                        }
                        customerResponse.responseMsg.Content = new StringContent(strResponse[1]);
                        response = ResponseMessage(customerResponse.responseMsg);
                    }

                }
            }
            else
            {
                // if credentials are not valid send unauthorized status code in response
                customerResponse.responseMsg.StatusCode = HttpStatusCode.Unauthorized;
                response = ResponseMessage(customerResponse.responseMsg);
            }
            return response;
        }
        #endregion

当我测试时(同时作为单个用户)这个 GetNonce() 方法工作正常,但是当我们尝试进行负载测试(同时对 GetNonce 方法的多个请求)时,我们得到以下错误 -

响应:状态 = 500;body = {'Message':'发生错误。','ExceptionMessage':'对象引用未设置为对象的实例。','ExceptionType':'System.NullReferenceException','StackTrace':'在MockWebAPI_with_JWT .Controllers.CustomerController.GetNonce(JObject customer)\r\n at lambda_method(Closure , Object , Object[] )\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.b__9(Object instance , Object[] methodParameters)\r\n at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancelToken)\r\n--- 堆栈跟踪从先前位置结束异常在 System.Runtime 抛出 ---\r\n。

提前感谢您的帮助。

标签: c#asp.net.netasp.net-web-api

解决方案


推荐阅读