[英]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
}
我的建議是要有一種控制器方法(您的客戶希望如何)執行以下操作:
那是看起來的樣子:
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.