2017-07-16 15 views
1

WebAPIコントローラのPOSTメソッドの1つから応答を送信しようとしています。 DBでは値は保存されていますが、tryとcatchの両方で応答を送信している間は、次の例外がスローされます。応答の送信時にASP.NET WebAPIエラーが発生しました

例外メッセージ:「値はnullではありません。パラメータ名:リクエスト」。

コントローラメソッドコード:

[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

私はこの問題を解決するために何をする必要があるか教えてください。ありがとう。

CreateResponseがnull参照を取得文句される実際の拡張方法

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

このメソッドを呼び出す場所にコードを追加できますか? – zzT

+0

@zzT APIコントローラメソッドを呼び出す場所の詳細を質問に反映しました。チェックしてください。 – Manju

+1

@Manjuなぜ手動でコントローラを作成していますか? APIは要求フローの一部としてそれを作成します。手動で作成することで、 'Request'が' null'の理由である 'Request'のような他の必須のプロパティを設定することはありません。 – 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

、以下のようにMVCコントローラメソッドからAPIコントローラメソッドを呼び出します。 Nkosiの答えは技術的には正解ですが、多くのリファクタリングを防止するために、ここで使用しているコントローラがリクエストに直接応答するようにコントローラの登録を変更してください(ここに示したコードのように思えます)

関連する問題