c# - 如何在 .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。
提前感谢您的帮助。
解决方案
推荐阅读
- javascript - 使 Next.js 与 ract-native-web 和 styled-components 一起使用
- ruby-on-rails - 组 has_and_belongs_to_many
- javascript - 刷新网页后如何存储数据?
- r - 使用 minpack.lm 中的 nlsLM 时导致输入参数不正确的原因是什么?
- user-interface - 在 Google Colaboratory 内部使用 NNI
- ios - IOS 13:UITextField rightView 的间距问题
- typescript - 使用 Typescript 的反应式 Vue Chart.js 组件
- mongodb - 2 个字段的 Mongodb 索引,其中一个使用 $gt 和 $lt
- google-chrome - Chrome 原生消息 - 启动另一个应用程序时断开连接
- ruby-on-rails - Rails http请求本身在测试中挂起