Server.Transfer和之间有什么区别Response.Redirect?
在ASP.NET MVC中,您可以非常轻松地返回重定向ActionResult:
return RedirectToAction("Index");
or
return RedirectToRoute(new { controller = "home", version = Math.Random() * 10 });
Run Code Online (Sandbox Code Playgroud)
这实际上会提供HTTP重定向,这通常很好.但是,当使用谷歌分析时,这会导致很大的问题,因为最初的引用会丢失,所以谷歌不知道你来自哪里.这会丢失有用的信息,例如任何搜索引擎术语.
作为旁注,此方法的优点是可以删除任何可能来自广告系列但仍允许我捕获服务器端的参数.将它们留在查询字符串中会导致人们加入书签或推特或博客链接,而这些链接不应该存在.我已经多次看到这样的情况,人们在我们的网站上链接了包含广告系列ID的链接.
无论如何,我正在为网站的所有传入访问写一个"网关"控制器,我可能会重定向到不同的地方或替代版本.
现在我更关心谷歌(比意外的书签),我希望能够发送访问/该页面的人,如果他们去了/home/7,这是主页的第7版.
就像我之前说的如果我这样做,我失去了谷歌分析引用者的能力:
return RedirectToAction(new { controller = "home", version = 7 });
Run Code Online (Sandbox Code Playgroud)
我真正想要的是一个
return ServerTransferAction(new { controller = "home", version = 7 });
Run Code Online (Sandbox Code Playgroud)
这将使我看到没有客户端重定向的视图.我不认为这样的事情存在.
目前我能想到的最好的事情是HomeController.Index(..)在我的GatewayController.IndexAction中复制整个控制器逻辑.这意味着我必须'Views/Home'进入,'Shared'因此它是可访问的.肯定有更好的办法??..
我正在使用Server.Transfer.一切正常,但异常日志显示以下异常.
System.Threading.ThreadAbortException: Thread was being aborted.
at System.Threading.Thread.AbortInternal()
at System.Threading.Thread.Abort(Object stateInfo)
at System.Web.HttpResponse.End()
at System.Web.HttpServerUtility.Transfer(String path, Boolean preserveForm)
at System.Web.HttpServerUtility.Transfer(String path)
Run Code Online (Sandbox Code Playgroud)
任何想法避免上述异常.
ASP.NET中的Response.Redirect和Server.Transfer有什么区别?
在什么情况下,人们想要使用一个而不是另一个?
我有一个HttpModuleC#2.0来处理抛出的异常.每当抛出异常时,都会调用带有一些查询字符串的错误页面(aspx).它完成了Server.Transfer().
但是当控件尝试执行时Server.Transfer(),会抛出以下异常:
执行[pagename] .aspx的子请求时出错.
而Request.Redirect()正常工作.
我尝试EnableViewStateMac="false"在传递请求的页面的Page指令中设置.仍然存在问题.
这是我试过的代码:
string errorPage = "errorpage.aspx?id=" + someErrorId
HttpContext.Current.Server.Transfer(errorPage,true);
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题吗?
在我的全局中,我有以下代码来处理错误发生时
//[..] code goes here
Server.Transfer("~/Error.aspx?ErrorID=" + errorId);
Run Code Online (Sandbox Code Playgroud)
它曾经是一个Response.Redirect完美的工作,除了它改变了网址(这就是为什么我要使用Server.Transfer)
不幸的是,现在当它尝试加载错误页面时,它在主页上尝试引用时会崩溃 Session
HttpException:
只有在配置文件或Page指令中将enableSessionState设置为true时,才能使用会话状态.还请确保System.Web.SessionStateModule或自定义会话状态模块包含在应用程序配置的\\部分中.
我的配置和页面都有enableSessionState.
我还发现了一些建议使用Context.RewritePath的链接 - 这只会导致为我加载空白页面.
使用Response.Redirect完美和按预期工作,所以我认为Server.Transfer是这里的问题.它是什么?
编辑代码:
protected void Application_Error(object sender, EventArgs e)
{
lock (_lockMe)
{
Exception ex = Server.GetLastError();
if (ex != null)
{
if (ex.InnerException != null)
ex = ex.InnerException;
ErrorLoggingManager.AddError(ex, new MembershipData(), ...); //etc
}
Server.ClearError();
//Some other database code for cleaning up some stuff when an error happens
}
try
{
if (Response != null) …Run Code Online (Sandbox Code Playgroud) 我在我的asp.net应用程序中看到错误
"无法评估表达式,因为代码已经过优化,或者本机框架位于调用堆栈之上."
protected void btnCustomerProfile_Click(object sender, EventArgs e)
{
try
{
Server.Transfer("CustomerProfile.aspx");
}
catch (Exception ex)
{
Response.Write(ex.ToString());
}
finally
{ }
}
Run Code Online (Sandbox Code Playgroud)
在搜索SO之后,我看到大多数类似的帖子都涉及response.redirect.我的代码使用的是server.transfer,我的应用程序也在使用母版页.
我该如何解决这个问题?
更新:由于某种原因,发生此错误是我也使用Response.Redirect.不幸的是我无法使用Server.Execute,因为Server.Execute将调用页面调用到最后.
我在global.asax的Application_Error方法中有一个自定义错误处理程序,当发生错误时我使用以下代码将用户转移到错误页面:
Server.Transfer("/Error/");
Run Code Online (Sandbox Code Playgroud)
但是,如果没有指定实际的页面名称,则上面的代码会出现" 执行/ Error /的子请求错误 "异常.
因此,如果我使用Server.Transfer("/Error/Default.aspx")它工作正常没有问题.
同样使用也可以Response.Redirect("/Error/")正常工作,但是我们希望继续使用Server.Transfer在显示错误页面时保留地址栏中显示的URL,这样用户只需刷新页面即可重试访问原始违规URL.
如果有人可以评论如何使Server.Transfer方法工作而不指定实际的aspx页面名称,将不胜感激.
非常感谢.
我使用的是Asp.net 2.0.我server.transfer从第1页到第2页执行操作.该URL仍然是第1页.现在我单击第2页上的链接,这将转移到第3页.因此URL应保留在第1页.而是浏览器现在显示页面的URL这是预期的行为吗?
我实际上是试图隐藏URL中的参数.
response.redirect因为我无法从此处访问上一页.任何人都能指出我正确的方向吗?
任何想法如何解决以下问题?
有一个伟大的实施提供TransferResult的位置,这对MVC 1,2伟大的工作,但对MVC 3 RC不起作用.
public class TransferResult : RedirectResult
{
public TransferResult(string url): base(url)
{
}
public override void ExecuteResult(ControllerContext context)
{
var httpContext = HttpContext.Current;
httpContext.RewritePath(Url, false);
IHttpHandler httpHandler = new MvcHttpHandler();
httpHandler.ProcessRequest(HttpContext.Current);
}
}
Run Code Online (Sandbox Code Playgroud)
在MVC 3 RC上,httpHandler.ProcessRequest失败并说 'HttpContext.SetSessionStateBehavior' can only be invoked before 'HttpApplication.AcquireRequestState' event is raised.
如何重写此代码以使其工作?
UPD:如果在VS 2010内置开发服务器上运行,代码可以工作,但无法在IIS 7.5 localhost上运行.问题仍未解决.
server.transfer ×10
asp.net ×7
c# ×3
asp.net-mvc ×2
redirect ×2
.net ×1
asp.net-2.0 ×1
c#-2.0 ×1
global-asax ×1
master-pages ×1
session ×1
url ×1