мы пытаемся получить следующую работу сценария:
мы используем asp:scriptmanager / CompositeScripts для объединения наших сценариев в несколько блоков сценария, но после того, как каждый развертывается к системе тестирования, мы испытываем затруднения из-за тестеров, не получающих обновленные версии CSS и JavaScript (кэш браузера). Для CSS мы определили наш собственный пользовательский элемент управления CSS, который добавляет параметр Siteversion"? v=1.0.190", например, к URL CSS. Этот siteversion определяется в web.config / appsettings и ударен на каждый развертывающийся.
Мы хотели смочь использовать ту же стратегию javascripts, но к настоящему времени я не имел никакого успеха. При рендеринге тега script. рендеринг Scriptmanager
<script src="/ScriptResource.axd?d=..." type="text/javascript"></script>
Учитывая, что настроенный siteversion тока был 1.0.190, я захочу, чтобы он представил
<script src="/ScriptResource.axd?d=...&v=1.0.190" type="text/javascript"></script>
Как я достигаю вывод HTML "сценария" из менеджера скриптов, таким образом, я могу изменить его? Это, кажется, не присутствует в материале, представленном в Рендеринге, RenderChildren или RenderControl
Ваш Andreas
Я предлагаю другой подход. Chache - ваша проблема, тогда измените заголовок кеша. Вот пример, который я создаю и тестирую, и он отлично работает. На global.asax в самом начале звонка ...
protected void Application_BeginRequest(Object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
string cTheFile = HttpContext.Current.Request.Path;
if (cTheFile.EndsWith("ScriptResource.axd", StringComparison.InvariantCultureIgnoreCase))
{
// here is the trick with your version !
string etag = "\"" + app.Context.Request.QueryString.ToString().GetHashCode().ToString() + "1.0.190" + "\"";
string incomingEtag = app.Request.Headers["If-None-Match"];
app.Response.Cache.SetETag(etag);
if (String.Compare(incomingEtag, etag) == 0)
{
app.Response.StatusCode = (int)System.Net.HttpStatusCode.NotModified;
app.Response.StatusDescription = "Not Modified";
}
else
{
app.Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(1));
app.Response.Cache.SetMaxAge(new TimeSpan(0, 1, 0));
app.Response.Cache.SetCacheability(HttpCacheability.Public);
}
}
}
Я немного покопался в отражателе, и похоже, что это, к сожалению, сложно добавить. MS не предоставила никаких хороших точек расширения, которые я мог бы найти. Однако, если вы хотите прибегнуть к хорошему способу отражения, добавление следующего ControlAdapter для ScriptManager должно помочь:
public class VersionedScriptManagerAdapter : ControlAdapter
{
protected new ScriptManager Control
{
get { return (ScriptManager) base.Control; }
}
protected override void OnPreRender(System.EventArgs e)
{
base.OnPreRender(e);
var compositeScriptField = Control.GetType().GetField("_compositeScript",
BindingFlags.NonPublic | BindingFlags.Instance);
var currentCompositeScript = Control.CompositeScript;
var versionedCompositeScript = new VersionedCompositeScriptReference();
CopyCompositeScript(currentCompositeScript, versionedCompositeScript);
compositeScriptField.SetValue(Control, versionedCompositeScript);
}
private void CopyCompositeScript(CompositeScriptReference sourceCompositeScript, CompositeScriptReference targetCompositeScript)
{
targetCompositeScript.Path = sourceCompositeScript.Path;
targetCompositeScript.ResourceUICultures = sourceCompositeScript.ResourceUICultures;
targetCompositeScript.ScriptMode = sourceCompositeScript.ScriptMode;
foreach (var scriptReference in sourceCompositeScript.Scripts)
{
targetCompositeScript.Scripts.Add(scriptReference);
}
}
private class VersionedCompositeScriptReference : CompositeScriptReference
{
protected override string GetUrl(ScriptManager scriptManager, bool zip)
{
string version = ConfigurationManager.AppSettings["ScriptVersion"];
return base.GetUrl(scriptManager, zip) + "&v=" + version;
}
}
}
Затем, чтобы подключить этот адаптер управления, вам нужно будет создать файл Web.browser и поместить его в папке App_Browsers на сайте. Файл Web.browser должен выглядеть примерно так:
<browsers>
<browser refID="Default">
<controlAdapters>
<adapter controlType="System.Web.UI.ScriptManager"
adapterType="MyNamespace.VersionedScriptManagerAdapter">
</adapter>
</controlAdapters>
</browser>
</browsers>
Я протестировал это, и у меня это сработало. Надеюсь, это поможет вам.