我有一个工作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路由?第二,什么是通过其内容和路线适当识别流量的最佳方式?
感谢您的协助。我承认在这里相当盲目,所以任何帮助都表示赞赏。
答案 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
}
我的建议是有一个控制器方法(客户想要的方式),它将执行以下操作:
它的外观如下:
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。