Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跨多个子域的URL路由_C#_Asp.net_Asp.net Mvc_Url Routing - Fatal编程技术网

C# 跨多个子域的URL路由

C# 跨多个子域的URL路由,c#,asp.net,asp.net-mvc,url-routing,C#,Asp.net,Asp.net Mvc,Url Routing,我发现自己处境困难。我们正在开发一个由多个部分组成的ASP.NETMVC2应用程序。设计目标是使这些部分跨越多个子域。每个子域都有自己的控制器 挑战在于,我们的主机提供商的控制面板允许两种形式的子域重定向,而这两种重定向似乎都不符合要求。这些选择包括: 重定向到URL。可以选择重定向到确切的目的地还是相对于请求URL的目的地 正在重定向到我的托管空间中的特定文件夹 我将试着说明预期的行为。假设默认路由是{controller}/{action}/{id},我想要URLhttp://subdo

我发现自己处境困难。我们正在开发一个由多个部分组成的ASP.NETMVC2应用程序。设计目标是使这些部分跨越多个子域。每个子域都有自己的控制器

挑战在于,我们的主机提供商的控制面板允许两种形式的子域重定向,而这两种重定向似乎都不符合要求。这些选择包括:

  • 重定向到URL。可以选择重定向到确切的目的地还是相对于请求URL的目的地

  • 正在重定向到我的托管空间中的特定文件夹

我将试着说明预期的行为。假设默认路由是
{controller}/{action}/{id}
,我想要URL
http://subdomain.welcome.com/a/b
由MVC应用程序处理,如
http://welcome.com/subdomain/a/b

URL重定向可以解决此问题,但用户在浏览器中看到URL更改的情况除外。我们不希望客户端看到发生重定向

重定向到MVC应用程序根文件夹根本不起作用。应用程序未接收请求,IIS会传回4xx错误

编辑:

为了找到答案,我将把它简化一点。“重定向到URL”不符合我的要求,因此会将重定向保留到文件夹


如果我将子域重定向到我的MVC应用程序的根文件夹,而IIS无法接收请求,这是IIS或我的提供商的限制吗?

不确定这是否过份(这实际上用于从zip文件或资源文件等提供页面),但是。。。也许您可以使用虚拟路径提供程序

实现一个从VirtualPathProvider继承的类,并在全局启动中注册它,如下所示:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
然后实现一个从VirtualFile继承的类,并通过虚拟路径提供程序实现中的GetFile()覆盖为其提供服务:

public override VirtualFile GetFile( string virtualPath )
{
 if( IsVirtualFile(virtualPath) )
    return new MyVirtualFile(virtualPath);
 return base.GetFile(virtualPath);
}

注意:IsVirtualFile是一个您必须实现的功能,它基于您关于URL格式等的规则。

不确定这是否过份(它实际上用于提供来自zip文件或资源文件等的页面),但是。。。也许您可以使用虚拟路径提供程序

实现一个从VirtualPathProvider继承的类,并在全局启动中注册它,如下所示:

HostingEnvironment.RegisterVirtualPathProvider(new MyVirtualPathProvider());
然后实现一个从VirtualFile继承的类,并通过虚拟路径提供程序实现中的GetFile()覆盖为其提供服务:

public override VirtualFile GetFile( string virtualPath )
{
 if( IsVirtualFile(virtualPath) )
    return new MyVirtualFile(virtualPath);
 return base.GetFile(virtualPath);
}

注意:IsVirtualFile是一个您必须实现的功能,基于您关于URL格式等的规则。

您能让您的托管网站主机头响应
*.mydomain.com
?也就是说,你的网站可以接受你主域名的任何子域名的请求吗?如果是这样的话,那么请参考如何在MVC应用程序中处理子域路由,您应该可以开始了

不过,为了使代码更加简洁,我会在帖子中对此进行更新。在任何情况下,请确保您为试图转到不存在的子域的人准备了404错误

public class ExampleRoute : RouteBase
{

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
            return null;

        var subDomain = url.Substring(0, index);

            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain
            routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller

            return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //Implement your formating Url formating here
        return null;
    }
}
公共类示例Route:RouteBase
{
公共覆盖路由数据GetRouteData(HttpContextBase httpContext)
{
var url=httpContext.Request.Headers[“主机”];
var index=url.IndexOf(“.”);
如果(指数<0)
返回null;
var subDomain=url.Substring(0,索引);
var routeData=new routeData(这是新的MvcRouteHandler());
RoutedData.Values.Add(“控制器”,子域);//尝试转到子域的控制器操作
routeData.Values.Add(“action”、“Index”);//转到User2Controller上的索引操作
返回路由数据;
}
公共覆盖VirtualPathData GetVirtualPath(RequestContext RequestContext,RouteValueDictionary值)
{
//在此处实现格式化Url格式化
返回null;
}
}

你能让你的托管网站主机头响应
*.mydomain.com
?也就是说,你的网站可以接受你主域名的任何子域名的请求吗?如果是这样的话,那么请参考如何在MVC应用程序中处理子域路由,您应该可以开始了

不过,为了使代码更加简洁,我会在帖子中对此进行更新。在任何情况下,请确保您为试图转到不存在的子域的人准备了404错误

public class ExampleRoute : RouteBase
{

    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var url = httpContext.Request.Headers["HOST"];
        var index = url.IndexOf(".");

        if (index < 0)
            return null;

        var subDomain = url.Substring(0, index);

            var routeData = new RouteData(this, new MvcRouteHandler());
            routeData.Values.Add("controller", subdomain); //attempts to go to controller action of the subdomain
            routeData.Values.Add("action", "Index"); //Goes to the Index action on the User2Controller

            return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        //Implement your formating Url formating here
        return null;
    }
}
公共类示例Route:RouteBase
{
公共覆盖路由数据GetRouteData(HttpContextBase httpContext)
{
var url=httpContext.Request.Headers[“主机”];
var index=url.IndexOf(“.”);
如果(指数<0)
返回null;
var subDomain=url.Substring(0,索引);
var routeData=new routeData(这是新的MvcRouteHandler());
RoutedData.Values.Add(“控制器”,子域);//尝试转到子域的控制器操作
routeData.Values.Add(“action”、“Index”);//转到User2Controller上的索引操作
返回路由数据;
}
公共覆盖VirtualPathData GetVirtualPath(RequestContext RequestContext,RouteValueDictionary值)
{
//在此处实现格式化Url格式化
返回null;
}
}