2015-04-01 88 views
1

我有一個工作的API與不同的端點 - 一個不同的控制器 - 對於我期望收到的每種類型的XML post數據。現在,客戶希望我們爲所有事物使用相同的端點。唯一確定方向的是XML數據的內容 - 基本上是根元素的名稱。多個apis共享相同端點的正確路由配置

我希望能夠儘可能多地利用我現有的工作,所以我試圖添加一個新的控制器「路由器」,它完全符合以下條件 - 根據收到的內容重定向到正確的路由。我嘗試了一些東西,但似乎沒有得到任何牽引力。

如果有更好的方法來處理這個問題,我會樂於聽到它。

 // WebApiConfig.cs 
     config.MapHttpAttributeRoutes(); 

     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "{controller}/{id}", 
      //routeTemplate: "Router", 
      constraints: null, 
      defaults: new { id = RouteParameter.Optional } 
     ); 

//在RouteConfig.cs中 - 這是多餘的特定MapRoute和MapHttpRoute?

 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(name: "First", url: "First/{action}/{id}"); 
     routes.MapRoute(name: "Second", url: "Second/{action}/{id}"); 
     routes.MapRoute(name: "Third", url: "Third/{action}/{id}"); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", 
          action = "Index", 
          id = UrlParameter.Optional } 
     ); 

但無論如何,我有我的API交通擊中RouterController (我會承認我並不完全清楚爲什麼它的工作),但一旦 那裏,我怎麼去重新路由基於XML數據發佈了嗎?

public RouterController() 
{ 
    log.Debug("Inside RouterController"); 
} 


public IHttpActionResult Post(object postdata) 
{ 
    // how to determine the postdata contents/XML structure to get the 
    // root element and then redirect to the "true" controller? 
} 

這裏有幾個問題:第一,爲什麼在WebApiConfig.cs路由定義和RouteConfig.cs的(明顯)路由冗餘?其次,根據內容和路線適當地識別流量的最佳方式是什麼?

感謝您的協助。我承認在這裏相當失明,所以任何幫助表示讚賞。

回答

1

我認爲這不是一個好主意,你的路線中有一些XML解析邏輯(如果甚至可能的話)。

根據你的描述我猜你有很多控制器的方法和模型。你可以保持它們幾乎不變,也許只是使方法私人化。

public class First 
{ 
    public string Name { get; set; } 
} 

public class Second 
{ 
    public string Name { get; set; } 
} 

private void HandleFirst(First model) 
{ 
    // Your existing code 
} 

private void HandleSecond(Second second) 
{ 
    // Your existing code 
} 

我的建議是有一個控制器方法(你的客戶怎麼想),將做以下事情:

  1. 接受原始請求數據
  2. 解析XML並獲得知道是什麼類型
  3. 通過反序列化XML創建模型
  4. 調用所需方法

這是怎麼可能看:

public void Post(HttpRequestMessage request) 
{ 
    using (var xmlReader = XmlReader.Create(request.Content.ReadAsStreamAsync().Result)) 
    { 
     xmlReader.MoveToContent(); 
     switch (xmlReader.Name) 
     { 
      case "First": 
       HandleFirst(Deserialize<First>(xmlReader)); 
       break; 
      case "Second": 
       HandleSecond(Deserialize<Second>(xmlReader)); 
       break; 
      default: 
       throw new NotSupportedException(); 
     } 
    } 
} 

private T Deserialize<T>(XmlReader xmlReader) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    return (T)serializer.Deserialize(xmlReader); 
} 

在這種情況下,你可以讓你的路由配置非常簡單。所有你需要的是使用默認的。您也可以仔細看看Web.API 2中引入的attribute routing

+0

非常感謝,這非常有幫助。我用這種方式重新設計了一半,到目前爲止,事情正在發生變化。欣賞它! – nonesuch 2015-04-02 18:48:18

+0

所以,我的一些類是嵌套的xml結構。當我執行Deserialize​​(xmlReader)時,在新的NestedClass對象中正確創建了根元素的直接子元素,但是下面的任何元素及其子元素均爲null。我一直在糾纏這幾個小時,無法弄清楚發生了什麼問題。 – nonesuch 2015-04-08 04:39:51

+0

我認爲你需要提出新的問題。添加您用於序列化的XML示例和類。你可以在這裏添加一個問題鏈接作爲評論。 – 2015-04-08 08:03:57

相關問題