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

Proper routing configuration for multiple apis sharing same endpoint

我有一个工作 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 数据 posted 重新路由?

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 路由中的(明显)冗余?其次,根据内容和适当的路线识别流量的最佳方式是什么?

感谢您的帮助。我承认 运行 在这里相当盲目,因此非常感谢您的帮助。

我认为在你的路由中有一些 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