【问题标题】:ASP.NET WebAPI error on sending response发送响应时出现 ASP.NET WebAPI 错误
【发布时间】:2017-07-16 07:34:46
【问题描述】:

我正在尝试从我的 webAPI 控制器的一种 POST 方法发送响应。在数据库中,值正在被保存,但是在尝试和捕获中发送响应时,它会引发以下异常。

异常消息:“值不能为空。参数名称:请求。”

控制器方法代码:

[HttpPost]
    public HttpResponseMessage AddEmployee(Employee emp)
    {
        try
        {
            using (EmployeeEntities dbEntity = new EmployeeEntities())
            {
                dbEntity.Configuration.LazyLoadingEnabled = false;
                dbEntity.Employees.Add(emp);
                dbEntity.SaveChanges();
                return Request.CreateResponse(HttpStatusCode.Created, emp); // EXCEPTION IS THROWN HERE
            }
        }
        catch(Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }

请让我知道我需要做些什么来解决这个问题。谢谢。

从 MVC 控制器方法调用 API 控制器方法,如下所示,

EmployeeController empCtrl = new EmployeeController();
empCtrl.AddEmployee(emp);

【问题讨论】:

  • 你能在调用这个方法的地方添加你的代码吗?
  • @zzT 用我调用 API 控制器方法的详细信息更新了我的问题。请检查。
  • @Manju 为什么要手动创建控制器? API 创建它作为请求流的一部分。通过手动创建它,您不会填充其他必需的属性,例如 Request,这就是为什么您的 Requestnull

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


【解决方案1】:

您正在手动创建控制器。框架通常将其创建为请求流的一部分。通过手动创建它,您不会填充其他必需的属性,例如Request,这就是为什么您的Requestnull

将您想要从 Web API 中执行的操作提取到服务中,并将其注入到 MVC 和 Web API 控制器中。这样,MVC 控制器就无需创建 API 控制器。

一些简单的例子

public EmployeeService : IEmployeeService {
    public Employee AddEmployee(Employee emp) {
        using (EmployeeEntities dbEntity = new EmployeeEntities()) {
            dbEntity.Configuration.LazyLoadingEnabled = false;
            dbEntity.Employees.Add(emp);
            dbEntity.SaveChanges();
            return emp;
        }
    }

    //...other service members
}

Web API 将使用该服务

public class EmployeeController : ApiController {
    private readonly IEmployeeService employeeService;

    public EmployeeController(IEmployeeService service) {
        this.employeeService = service;
    }

    [HttpPost]
    public HttpResponseMessage AddEmployee(Employee emp) {
        try {
            employeeService.AddEmployee(emp);
            return Request.CreateResponse(HttpStatusCode.Created, emp);
        } catch(Exception ex) {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex.Message);
        }
    }

    //...other actions.
}

MVC 控制器也可以使用相同的服务。

【讨论】:

    【解决方案2】:

    实际的扩展方法 CreateResponse 抱怨获取空引用。 Nkosi 的回答在技术上是正确的,但为了防止大量重构,只需更改您的控制器注册,以便您在此处使用的控制器直接响应请求(就像您从此处给出的代码中想要的那样)

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 2018-06-16
      • 1970-01-01
      • 2016-06-04
      • 2020-03-24
      • 2019-01-25
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      相关资源
      最近更新 更多