Как ReportManager может использовать другой порт внешне, чем из-за брандмауэра?

Почему бы не устанавливать что-то как Pingdom для контроля контролирующего хоста?

2
задан 15 December 2013 в 20:27
1 ответ

У меня есть кое-что, что работает на SSRS 2012, но это полный взлом. Можно использовать клиентский Javascript для перезаписи всех URL-адресов (плюс случайный параметр RedirectUrl, который любит SSRS), но это не учитывает серверные вызовы Response.Redirect (). Таким образом, у вас останется частичное решение.

Короче говоря, добавьте HttpModule в ReportManager, чтобы вы могли добавить обработчик событий PreRequestHandlerExecute. Внутри него используйте Reflection, чтобы исправить GlobalApp.BaseUrl и Request.Url, чтобы отключить заголовок HOST вместо значения по умолчанию. Вы должны изменить оба, потому что SSRS не всегда использует свой собственный BaseUrl при построении ссылок. (Я использовал ILSpy, чтобы найти, какие поля нужно изменить.)

Вот мое. Я уверен, что можно было бы сделать лучше, но то, что у меня есть, работает, и мне уже все равно. Работа над SSRS позволяет высасывать из вас желание жить.

РЕДАКТИРОВАТЬ : исправлена ​​часть, изменяющая Request.Url. Обратите внимание, что хотя он указывает .Fragment, клиент его не отправляет, поэтому он всегда пуст.

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);
            }
        }
    }
}
1
ответ дан 3 December 2019 в 12:59

Теги

Похожие вопросы