Eu tenho algo que funciona no SSRS 2012, mas é um hack total. É possível usar o Javascript do lado do cliente para reescrever todas as URLs (mais o ocasional parâmetro RedirectUrl do SSRS), mas isso não leva em conta as chamadas Response.Redirect () do lado do servidor. Então você ficaria com uma solução parcial.
Em suma, adicione um HttpModule ao ReportManager para adicionar um manipulador de eventos PreRequestHandlerExecute. Dentro dele, use Reflection para corrigir GlobalApp.BaseUrl e Request.Url para sair do cabeçalho HOST em vez do padrão. Você precisa alterar ambos porque o SSRS nem sempre usa seu próprio BaseUrl ao criar links. (Eu usei o ILSpy para encontrar os campos a serem alterados.)
Aqui é meu. Tenho certeza de que poderia ser feito melhor, mas o que eu tenho funciona e eu realmente não me importo mais. Trabalhar no SSRS tem um jeito de sugar a vontade de viver de você.
EDITAR : Corrigida a parte que modifica Request.Url. Observe que, embora esteja especificando .Fragment, o cliente não envia isso, portanto, está sempre em branco.
void context_PreRequestHandlerExecute(object sender, EventArgs ea)
{
HttpApplication app = sender as HttpApplication; // also at: HttpContext.Current.ApplicationInstance
string host = app.Context.Request.Headers["HOST"];
if (!string.IsNullOrEmpty(host))
{
System.Reflection.FieldInfo fi = typeof(Microsoft.ReportingServices.UI.GlobalApp).GetField("m_baseUrl", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (fi != null)
{
string protocol = "http://";
if (app.Context.Request.IsSecureConnection)
protocol = "https://";
Uri url = new Uri(string.Format("{0}{1}{2}", protocol, host, app.Context.Request.ApplicationPath));
fi.SetValue(app as Microsoft.ReportingServices.UI.GlobalApp, url);
fi = typeof(System.Web.HttpRequest).GetField("_url", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
if (fi != null)
{
url = new Uri(string.Format("{0}{1}{2}{3}{4}", protocol, host, app.Context.Request.FilePath, app.Context.Request.Url.Query, app.Context.Request.Url.Fragment));
fi.SetValue(app.Context.Request, url);
}
}
}
}