【发布时间】:2018-10-27 07:57:57
【问题描述】:
我为 Web API 和 asp.net 核心应用程序创建了两个项目。 我想在我的应用程序中实现 web api。
我的 web api 中的“PUT”方法:
[Consumes("application/json")]
[HttpPut]
public async Task<IActionResult> PUT(Employee employee)
{
try
{
await employeeRepository.UpdateEmployeeByProperty(
employee, e => e.FirstName,
e => e.MiddleName, e => e.LastName,
e => e.DateOfBirth, e => e.ContactNo,
e => e.EmailId, e => e.HighestQualification,
e => e.TypeOfEmployee, e => e.Gender,
e => e.StartDate, e => e.EndDate);
if (await employeeRepository.SaveChangesAsync())
{
return Ok();
}
else
{
return BadRequest();
}
}
catch (Exception)
{
return BadRequest();
}
}
我正在使用以下代码在我的应用程序中调用上述方法:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> EditEmployee(Employee employeeModel,string email,int id)
{
var UserWithSameEmail = (Employee)null;
if(employeeModel.EmailId!=email)
UserWithSameEmail = _dbContext.Employee
.Where(e => e.EmailId == employeeModel.EmailId).SingleOrDefault();
if (ModelState.IsValid)
{
employeeModel.UpdatedDate = DateTime.Now;
if (UserWithSameEmail == null)
{
HttpClient client = new HttpClient();
client.BaseAddress = new Uri("http://localhost:50822");
var json = JsonConvert.SerializeObject(employeeModel);
HttpResponseMessage response = client
.PutAsJsonAsync("api/employee",json).Result;
if (response.IsSuccessStatusCode)
{
TempData["msg"] = "" + employeeModel.EmailId + " updated successfully";
ModelState.Clear();
}
}
else
{
ModelState.AddModelError("EmailId", "Email Id already exists");
}
}
return View("_EditEmployeePartial", employeeModel);
}
但是当我运行应用程序时,我收到了状态码为 400 的错误
{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content:
System.Net.Http.HttpConnection+HttpConnectionResponseContent, Headers:
{
Server: Kestrel
X-SourceFiles: =?UTF-8?B? RjpcQyBQYXJ0aXRpb25cRG9jdW1lbnRzXFRlamFzIFRyYWluaW5nXEVtcGxveWVlTWFuYWdlbWVudFN5c3RlbVxFbXBsb3llZU1hbmFnZW50LldlYlxXZWJBUElcYXBpXGVtcGxveWVl?=
X-Powered-By: ASP.NET
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Date: Sat, 27 Oct 2018 07:54:27 GMT
Content-Length: 0
}}
请帮我解决这个问题....!!!
【问题讨论】:
-
这两个动作是在同一个 api 中运行,还是在不同端口上运行的不同应用程序中运行?如果它们在同一运行时运行,请将您的控制器转换为服务,不要通过网络调用它们,而只需将它们作为服务注入。更简洁的解决方案是将这些控制器操作的主体外包到服务中,并简单地调用服务,而不是将一个控制器注入另一个控制器。
-
这两个动作在不同的项目中,一个来自Web API,另一个来自asp.net核心应用......那我该怎么办?
-
您可以将公共代码(数据库逻辑)提取到其他两个将引用的第三个项目中。另外,您是否真的使用调试器单步执行并验证了 db 调用是否成功?您的代码使用一般 400 错误来掩盖实际错误。
-
嗯,对我来说看起来很可疑的是,您没有在
PutAsJsonAsync()上使用await,而是直接访问响应结果。此外,我强烈建议将客户端作为服务注入,而不是在控制器中连接所有内容。
标签: asp.net-web-api asp.net-core-mvc