C#.net UriTemplate匹配来自白名单或池或服务器的URL

时间:2017-03-09 07:38:57

标签: c# asp.net .net asp.net-web-api httpcontext

您可以使用UriTemplate来解析网址:

我有这个代码在localhost:29001本地,我将主机设置为特定的Uri,然后检查它是否是Match

在我的真实代码中,我确实有一行

var absoluteUri = HttpContext.Current.Request.Url.AbsoluteUri;
其中

就像这样使用

var match = apiTemplate.Match(host, new Uri(absoluteUri));

但实质上这就是C#运行时代码的样子。

var host = new Uri("http://localhost:29001");
var apiTemplate = new UriTemplate("{api}/{*params}", true);

var match = apiTemplate.Match(host, new Uri("http://localhost:29001/GetQAByDateTime/date/2-15-2017/time/11"));
if (match == null)
    throw new ArgumentException();

Console.WriteLine(match.BoundVariables["api"]);     // GetQAByDateTime
Console.WriteLine(match.BoundVariables["params"]);  // date/2-15-2017/time/11

所以基本上我不想hardcode host

  var host = new Uri("http://localhost:29001");

当然,我可以从HttpContext获取服务器名称,但有什么意义呢?我不应该检查像

这样的池或服务器
localhost
localhost:290001
https://myserver.com
https://myStagingServer/website
etc..

如何在这些游戏池上进行匹配?

1 个答案:

答案 0 :(得分:1)

您可以直接从HttpContext.Current.Request.Url

中提取主机
var uri = HttpContext.Current.Request.Url;
var host = new Uri(uri.Scheme + "://" + x.Authority);

编辑:我应该补充一点,Uri.Host被避免,因为"与Authority属性不同,此属性值不包括端口号。"