发送响应时ASP.NET WebAPI错误

时间:2017-07-16 07:34:47

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

我正在尝试从我的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);
        }
    }

enter image description here

请让我知道解决此问题需要做些什么。感谢。

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

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

2 个答案:

答案 0 :(得分:2)

您正在手动创建控制器。框架通常会将其作为请求流的一部分创建。通过手动创建它,您不会填充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
}

网络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的答案在技术上是正确的,但为了防止大量重构,只需更改控制器注册,以便您在此处使用的控制器直接响应请求(就像您似乎打算从这里给出的代码)