多个api共享相同端点的正确路由配置

时间:2015-04-01 21:20:24

标签: c# xml routing asp.net-web-api2

我有一个工作API,它有一个不同的端点 - 一个不同的控制器 - 用于我希望收到的每种类型的XML post数据。现在,客户希望我们为所有事情使用相同的端点。方向的唯一确定是XML数据的内容 - 基本上是根元素的名称。

我希望尽可能多地利用我现有的工作,所以我试图添加一个新的控制器" Router"这正是如此 - 根据收到的内容重定向到正确的路线。我已经尝试了一些东西,但似乎无法获得任何牵引力。

如果有更好的方法来解决这个问题,我会乐于听到它。

        // 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 个答案:

答案 0 :(得分: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. 创建模型
  5. 致电所需方法
  6. 它的外观如下:

    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