2015-08-09 26 views
0

我有一個C#MVC web應用程序。 我有2個控制器。每個人都有返回HttpResponseMessage這一行的方法:調用不同的控制器,但保存請求?

return Request.CreateResponse(<StatusCode>, <value>); 

我需要在控制器2是方法2將調用方法1在控制器1,得到它的響應,並使用它來創建自己的反應。於是我在控制器2的方法2創建控制器1,比調用它的方法1 -

// Controler 1 
[InitializeSimpleMembership] 
public class ItemsController : ApiController, IDisposable 
{ 
     Service1 m_s1; 
     Service2 m_s2; 
     Service3 m_s3; 
     Service4 m_s4; 
    // Controler 1 constructor 
     public ItemsController (Service1 s1, Service2 s2, Service3 s3, Service4 s4) 
     { 
      m_s1 = s1; 
      m_s2 = s2; 
      m_s3 = s3; 
      m_s4 = s4; 
     } 
     // Controler 1 Method1 
     [AllowAnonymous] 
     [HttpPost] 
     public HttpResponseMessage Method1(IEnumerable<Item> items) 
     { 
      List<Item> items2 = new List<Item>(); 
      // ... 
      if (...) 
      { 
       return Request.CreateResponse(HttpStatusCode.OK, items2); 
      } 
      else 
      { 
       return Request.CreateResponse(HttpStatusCode.InternalServerError, errorList); 
      } 
     } 
} 

// Controler 2 
[InitializeSimpleMembership] 
public class CarsController : ApiController, IDisposable 
{ 
     Service1 m_s1; 
     Service4 m_s4; 
     Service5 m_s5; 

     // Controler 2 Constructor 
     public CarsController(Service1 s1, Service4 s4, Service5 s5) 
     { 
      m_s1 = s1; 
      m_s4 = s4; 
      m_s5 = s5; 
     } 

     // Controler 2 method2 
     [AllowAnonymous] 
     [HttpPost] 
     public HttpResponseMessage Method2(Car car) 
     { 
      // ... 
      Service2 s2 = new Service2(); 
      Service3 s3 = new Service3(); 
      ItemsController itemsController = new ItemsController (m_s1, s2, s3, m_s4); 
      HttpResponseMessage response = itemsController.Method1(items); 
      List<Item> items2; 
      response.TryGetContentValue<List<Item>>(out items2); 
      return Request.CreateResponse(HttpStatusCode.OK, items2); 
     } 
} 

的問題是,當我創建控制器1(上述ItemsController)這樣的 - 它沒有「請求」(它爲空)。 於是,我就發送這樣的請求 -

[AllowAnonymous] 
    [HttpPost] 
    public HttpResponseMessage Method1_Shell(IEnumerable<Item> items, HttpRequestMessage request) 
    { 
     if (Request == null) 
     { 
      Request = request; 
     } 
     return Method1(items); 
    } 

但我不知道是否有更好的方法來做到這一點。

回答

1

我需要controller2中的method2將調用controller1中的method1,獲取它的響應並使用它來創建它自己的響應。因此,我在controller2的method2中創建controller1,並調用其方法1

我認爲這是在您的應用程序中錯誤地分割的問題。在這種情況下,我會建議你創建一些服務來完成你在ItemsController中所做的工作,並在兩個控制器之間共享。

使用共享服務的方式你得到至少以下好處:

  1. 您可以從緊耦合和不必要的複雜邏輯擺脫與其他控制器的實例並調用其方法。

  2. 您的其他控制器看起來更簡單,沒有第二個參數 HttpRequestMessage參數。

+0

是的,但我會採取了很多的工作,保時間,我不能做到這一點,現在,只有在未來。我需要處理現有的情況。 (我不是我的老闆:)) – TamarG

+0

@TamarG我不熟悉你的情況,但是通過查看你提供的代碼示例,我可以說'CarsController'中的代碼與'ItemsController'非常耦合。因此,將來很難做出進一步的改變,它可能會讓你的老闆信服): –

+0

這不是我真正的代碼,當然,我改變了代碼和名稱,儘可能地將其作爲一般數據,只在這裏複製我需要這個例子。在我的代碼中 - 每個控制器在每種方法中都有很多方法和一個長代碼...... :) – TamarG

0

我認爲它更好,如果您使用請求uri並在controller2發送一個http請求到controller1。獲取響應並編輯。

相關問題