【问题标题】:Calling PUT method from web api in mvc controller在 mvc 控制器中从 web api 调用 PUT 方法
【发布时间】: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


【解决方案1】:
  1. 正如@B12Toaster 所说的那样:

    HttpResponseMessage 响应 = client.PutAsJsonAsync("api/employee",json).Result; 应该读

    HttpResponseMessage 响应 = 等待 client.PutAsJsonAsync("api/employee",json);

使用 .Result 时往往会发生令人讨厌的死锁;

  1. 您有两个 return BadRequest(); 语句,如果您返回 400,那么是因为您肯定会遇到其中一个语句。你需要调试它,我想找出原因。

  2. 这个:

    catch (Exception)
    {
        return BadRequest();
    }
    

不应该是return InternalServerError();,以便您的调用应用程序知道出现问题。您可能还应该在某处记录此异常,以便知道发生了什么。

  1. 为什么这是一个 BadRequest?

    如果(等待employeeRepository.SaveChangesAsync()) { 返回确定(); } 别的 { 返回 BadRequest(); }

在处理或保存数据之前,您应该检查Employee 以确保在实际进行保存或处理之前处理或保存可以成功并立即返回 BadRequest 然后在处理之前应该知道SaveChangesAsync 应该工作.我们称之为验证 ;-)

如果您查看所有这些要点,那么您将更接近找到答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    相关资源
    最近更新 更多