C# net模板匹配来自白名单、池或服务器的url

C# net模板匹配来自白名单、池或服务器的url,c#,asp.net,.net,asp.net-web-api,httpcontext,C#,Asp.net,.net,Asp.net Web Api,Httpcontext,您可以使用UriTemplate解析url: 我有一段代码,在本地主机上:29001我将主机设置为一个特定的Uri,然后检查它是否匹配 在我的真实代码中,我确实有这行代码 var absoluteUri = HttpContext.Current.Request.Url.AbsoluteUri; 其中一个是这样使用的 var match = apiTemplate.Match(host, new Uri(absoluteUri)); 但本质上,这就是代码在C中运行时的样子 var host

您可以使用UriTemplate解析url:

我有一段代码,在本地主机上:29001我将主机设置为一个特定的Uri,然后检查它是否匹配

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

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
所以本质上我不想硬编码主机

当然,我可以从HttpContext中获取服务器名称,但这有什么意义呢?我不应该检查一个池或类似的服务器吗

localhost
localhost:290001
https://myserver.com
https://myStagingServer/website
etc..

我怎样才能在一个游泳池里比赛

您可以直接从httpcontext.Current.Request.Url提取主机:


编辑:我应该添加该Uri。避免使用主机,因为与Authority属性不同,此属性值不包括端口号。

因此我使用了linqpad,我看到var match是UriTemplateMatch,我可以看到它是一个非常有用的复杂对象。但是,我可以更改var host=new Urihttp://blahblahliterally 我仍然得到相同的结果,所以我不明白。Match真的在做什么。抱歉,回答晚了。等等,什么是x。Authority?@JeremyMiller该属性通常是服务器DNS主机名或IP地址。如果服务端口号不同于URI的默认端口,则此属性可能包括服务端口号。如果授权组件包含保留字符,则这些字符将在该属性返回的字符串值中转义。
localhost
localhost:290001
https://myserver.com
https://myStagingServer/website
etc..
var uri = HttpContext.Current.Request.Url;
var host = new Uri(uri.Scheme + "://" + x.Authority);