C# 作为查询字符串的子域

C# 作为查询字符串的子域,c#,asp.net,C#,Asp.net,在ASP.net C#中有没有办法将子域视为查询字符串 我的意思是,如果用户键入了london.example.com,那么我可以读取到他正在查找london数据,并基于此运行查询example.com当前没有任何子域。这是一个DNS问题而不是一个C#/ASP.Net/IIS问题。理论上,你可以使用一个。实际上,您会在以下链接中遇到此问题: RFC1034中规定了通配符匹配的确切规则,但这些规则既不直观也不明确。这导致了不兼容的实现和使用时的意外结果 所以你可以尝试一下,但结局不太可能好。此外,

在ASP.net C#中有没有办法将子域视为查询字符串


我的意思是,如果用户键入了
london.example.com
,那么我可以读取到他正在查找
london
数据,并基于此运行查询
example.com
当前没有任何子域。

这是一个DNS问题而不是一个C#/ASP.Net/IIS问题。理论上,你可以使用一个。实际上,您会在以下链接中遇到此问题:

RFC1034中规定了通配符匹配的确切规则,但这些规则既不直观也不明确。这导致了不兼容的实现和使用时的意外结果

所以你可以尝试一下,但结局不太可能好。此外,在测试环境中运行之前,您可以对其进行处理,但这并不能保证对一般公众来说一切顺利。您可能会更好地选择一个具有API的好DNS提供商,并编写代码来使用API保持各个DNS条目的同步。您也可以设置自己的公共DNS服务器,不过我强烈建议您使用知名的商业DNS主机

您可能遇到的另一个问题是TLS/SSL证书(因为您当然要使用HTTPS.Right?Right!?),您可以尝试使用通配符证书,可能还可以,但根据您所做的其他工作,您可能会发现它不够;突然之间,您需要为数据库中的每个城市条目提供一个单独的SSL证书,这可能是一个真正的难题,即使是通过Let's Encrypt服务


如果您确实尝试过,IIS可以轻松地基于通配符主机名将请求映射到您的ASP.Net应用程序,而ASP.Net本身也可以轻松地从请求中读取和解析主机名,并基于此返回不同的结果。IIS URL重写应该能够帮助实现这一点,尽管我不确定是否可以基于此属性在C#/ASP.Net中执行股票MVC路由

低技术解决方案可以是这样的:(参考:)

公共静态列表子域(此HttpRequest请求)
{
//变数
字符串[]requestArray=Request.Host().Split(“.”.ToCharArray());
var subDomains=新列表();
//确保这不是ip地址
if(Request.IsIPAddress())
{
返回子域;
}
//确保我们有所有必要的零件
if(requestArray==null)
{
返回子域;
}
//最后一部分是tld(例如com)
//从第二部分到最后一部分是域(例如mydomain)
//其余部分为子域
如果(requestArray.Length>2)
{
对于(int i=0;i 0)
{
//处理多个子域的情况(例如dev.www)
返回请求.SubDomains().Last();
}
其他的
{
//处理没有子域的情况
返回字符串。空;
}
}
//例如azurewebsites.net
公共静态字符串域(此HttpRequest请求)
{
//变数
字符串[]requestArray=Request.Host().Split(“.”.ToCharArray());
//确保这不是ip地址
if(Request.IsIPAddress())
{
返回字符串。空;
}
//localhost的特殊情况
if(Request.IsLocalHost())
{
返回请求.Host().ToLower();
}
//确保我们有所有必要的零件
if(requestArray==null)
{
返回字符串。空;
}
//确保我们有所有必要的零件
如果(requestArray.Length>1)
{
返回$“{requestArray[requestArray.Length-2]}.{requestArray[requestArray.Length-1]}”;
}
//返回空字符串
返回字符串。空;
}
以下问题与你的问题类似:


我必须补充前面的答案,在您修复dns并将子域转换为某些参数后,您可以使用
重写路径
将这些参数移动到页面中

例如,假设一个函数
PathTranslate()
,将
london.example.com
转换为
example.com/default.aspx?Town=1

然后使用
重写路径
保留子域,同时将参数发送到页面

string sThePathToReWrite = PathTranslate();

if (sThePathToReWrite != null){
    HttpContext.Current.RewritePath(sThePathToReWrite, false);
}


也许通过IIS URL重写,@mjwills的可能副本我正在使用web表单人们仍然使用ArrayList类型?为什么不使用列表?
string sThePathToReWrite = PathTranslate();

if (sThePathToReWrite != null){
    HttpContext.Current.RewritePath(sThePathToReWrite, false);
}
string PathTranslate()
{
    string sCurrentPath = HttpContext.Current.Request.Path;
    string sCurrentHost = HttpContext.Current.Request.Url.Host;

    //... lot of code ...

    return strTranslatedUrl
}