好的,让我以不同的方式问这个问题。我们有一个网络应用程序。我们有付费和试用用户。他们每个人都有一个以用户名命名的文件夹,这就是他们的代码所在的位置。代码从URL获取用户ID,因此我们无法更改URL。我想整合代码的位置,以便人们转到与今天相同的URL(sitename / username),但它将从单个位置返回应用程序代码(这是一个文件夹结构)。我已经尝试了我能想到的一切,但Server.Transfer无法转移到文件夹,转移到index.html不起作用,Server.TransferLocation和(当然)Response.Redirect更改客户端的URL
我已尝试在RouteHandler中执行此操作,并且在Controller中,它没有任何区别,我找不到将用户透明地重定向到中央代码库的方法。理想情况下,我会在代码中执行此操作,因此我可以验证它们是什么类型的用户并相应地重定向它们。
经过多次迭代,现在是核心代码:
public class FarmHttpHandler : IRouteHandler
{
enum UserType { Invalid = -1, Standard = 1, Tester = 2, Developer = 3}
public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
// Note - this has to be a valid URL, or it will loop forever, as our HTTP handler is at the base level.
// We need to add a 'bad request' page, or it could default to the demo ( this would be a support nightmare though, if someone mistyped their URL,
// they would think it was fine, at first.
string redirect = "/Home/Error";
var routeValues = requestContext.RouteData.Values;
if (routeValues.ContainsKey("farmName"))
{
string farmName = routeValues["farmName"].ToString();
string baseUrl = "/";// HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.AbsolutePath, "/");
switch(GetUserType(farmName))
{
case UserType.Invalid:
break;
case UserType.Developer:
redirect = baseUrl + Settings.BetaAppPath;
break;
case UserType.Standard:
redirect = baseUrl + Settings.FullAppPath;
break;
case UserType.Tester:
redirect = baseUrl + Settings.TesterAppPath;
break;
}
}
HttpContext.Current.Server.TransferRequest(redirect);
requestContext.HttpContext.RewritePath(redirect);
return requestContext.HttpContext.Handler;
}
这被调用,但重写路径没有做任何事情(错误说没有返回IHttpHandler)和TransferRequest工作,但URL在浏览器中更改。代码还使用图像等的相对路径,这些不加载(不确定我是否可以实际修复此问题)。
答案 0 :(得分:0)
答案是
return BuildManager.CreateInstanceFromVirtualPath(URl, typeof(Page)) as Page;
这就是你如何从路由器返回重定向。遗憾的是,它对我不起作用,浏览器无法在我们的Web应用程序中重定向请求,并且它不会向完整URL发出请求,这意味着我无法检测到它们以重新映射它们。