好吧,让我换一种方式问这个问题。我们有一个网络应用程序。我们有付费和试用用户。他们每个current都有一个以用户id命名的文件夹,这就是他们的代码所在的地方。代码从URL中获取用户id,因此我们无法更改URL。我想合并我们代码的位置,这样人们就可以访问与现在相同的URL(网站名/用户名),但它将从一个位置返回应用程序代码(这是一个文件夹结构)。我已经尝试了我能想到的一切,但Server.Transfer无法传输到文件夹,传输到index.html不起作用,Server.TransferLocation和(当然)响应。重定向更改客户端的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;
}
这被调用了,但rewritepath什么都不做(错误显示没有返回IHttpHandler),TransferRequest也能工作,但浏览器中的URL发生了变化。该代码还使用图像等的相对路径,并且这些路径不会加载(不确定我是否真的能解决这个问题)。
答案是
return BuildManager.CreateInstanceFromVirtualPath(URl, typeof(Page)) as Page;
这就是从routehandler返回重定向的方式。遗憾的是,它对我不起作用,浏览器无法在我们的网络应用程序中重定向请求,也无法将请求发送到完整的URL,这意味着我无法检测到它们来重新映射它们。