我正在IIS 8上使用ASP.NET开发大型云应用程序。我们主要使用基于属性的ASP.NET routing,并且HTTP端点分布在许多Web API控制器类中(分布在许多类中)(认为100个)主要是松散耦合的模块。
现在,对于一种特定的(参数化的)路由,我想执行URL重写。
到目前为止,我正在将IIS URL Rewrite module与基于RegEx的规则一起使用。但是,对于我们的目的而言,这还不够动态。 1
基本上,我想使用路由的一部分,将其用作模块中运行时可用的内部映射中的键,然后根据键映射到的值重写URL。我想像这样的东西(伪C#):
[Route("execute/{machine}/{port}")]
[HttpGet]
public MyResponse DoSomething(string machine, int port)
{
string hostName;
if (!knownHosts.TryGetValue(machine, out hostName))
{
throw new HttpResponseException(HttpStatusCode.NotFound);
}
return RewriteRequest($"https://{hostName}.mycompany.com:{port}/myspecialcommand");
}
我看到了一些相关的资源,但是没有一个能完全解决我的问题:
RewritePath
method上的HttpContext
可用于重写。但是,我发现的任何示例都为此使用了某种全局注册的begin请求方法,而不是将其保留在模块中的本地方法。Redirect
method似乎是在路线后面的方法中调用的。但是,我不确定它在技术和性能上是否与重写相同。 (相反,我怀疑这会将redirection status code返回给客户端。是否可以通过我的路由方法告诉IIS当前处理的请求的URL需要重写?
1 :意味着我们可以在web.config中使用基于RegEx的固定规则,但这并不是一个好的解决方案。