我正在尝试从我的webAPI控制器的一个POST方法发送响应。在数据库中,值被保存,但是在try和in catch中发送响应时,它会抛出以下异常。
异常消息:“值不能为空。参数名称:请求。”
控制器方法代码:
[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);
答案 0 :(得分:2)
您正在手动创建控制器。框架通常会将其作为请求流的一部分创建。通过手动创建它,您不会填充Request
之类的其他必需属性,这就是Request
为null
的原因。
将您想要从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
}
网络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 Controller也可以使用相同的服务。
答案 1 :(得分:0)
实际的扩展方法CreateResponse抱怨获取空引用。 Nkosi的答案在技术上是正确的,但为了防止大量重构,只需更改控制器注册,以便您在此处使用的控制器直接响应请求(就像您似乎打算从这里给出的代码)