多个 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
}
我的建议是使用一种控制器方法(您的客户希望如何)来执行以下操作:
- 接受原始请求数据
- 解析XML并了解类型
- 通过反序列化创建模型 XML
- 调用需要的方法
它可能是这样的:
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
我有一个工作 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
}
我的建议是使用一种控制器方法(您的客户希望如何)来执行以下操作:
- 接受原始请求数据
- 解析XML并了解类型
- 通过反序列化创建模型 XML
- 调用需要的方法
它可能是这样的:
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