簡體   English   中英

共享同一端點的多個API的正確路由配置

[英]Proper routing configuration for multiple apis sharing same endpoint

對於我希望接收的每種XML發布數據,我都有一個具有不同端點(一個不同控制器)的有效API。 現在,客戶希望我們對所有內容使用相同的端點。 方向的唯一確定是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路由中的(表觀)冗余? 其次,通過流量的內容和適當的路由來識別流量的最佳方法是什么?

謝謝你的協助。 我承認這里相當盲目,所以我們將為您提供任何幫助。

我認為在路由中具有一些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中引入的屬性路由

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM