2017-07-16 63 views
1

我試圖從我的webAPI控制器的POST方法之一發送響應。在數據庫中,這些值得到保存,但在try和catch中發送響應時,拋出以下異常。ASP.NET WebAPI發送響應錯誤

異常消息:「值不能爲空參數名稱:請求。」

控制器方法代碼:

[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); 
+0

你可以在你調用這個方法的地方添加你的代碼嗎? – zzT

+0

@zzT更新了我的問題,並詳細介紹了我所說的API控制器方法。請檢查。 – Manju

+1

@Manju你爲什麼手動創建控制器?該API創建它作爲請求流的一部分。通過手動創建它,你不會填充其他所需的屬性,比如'Request',這就是爲什麼你的'Request'是'null'的原因。 – Nkosi

回答

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控制器可以使用相同的服務也是如此。

0

實際擴展方法CreateResponse抱怨得到一個空引用。 Nkosi的答案在技術上是正確的,但爲了防止大量重構,只需更改您的控制器註冊,以便您在此處使用的控制器直接響應請求(就像您打算從此處給出的代碼一樣)