2015-04-01 54 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

相关问题