Получить MVC Bundle Querystring

Можно ли обнаружить строку запроса пакета в ASP.NET MVC?

Например, если у меня есть следующий запрос пакета:

  

/css/bundles/mybundle.css?v=4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1

Можно ли извлечь строку запроса v?:

  

4Z9jKRKGzlz-D5dJi5VZtpy4QJep62o6A-xNjSBmKwU1


Я пытался сделать это в связке, но безуспешно. Я обнаружил, что даже если для UseServerCache установлено значение false код преобразования не всегда выполняется.

7 голосов | спросил Curt 21 J000000Tuesday15 2015, 16:15:54

1 ответ


0

Прошло много времени с тех пор, как я работал с ASP Bundler (я помню, что это было полное дерьмо), и эти заметки из моей памяти. Пожалуйста, подтвердите его все еще в силе. Я обновлю это, когда вернусь на свой компьютер для разработки. Надеюсь, это послужит отправной точкой для вашего поиска.

Чтобы решить эту проблему, вы должны исследовать ее в пространстве имен System.Web.Optimization.

Наиболее важным является класс System.Web.Optimization.BundleResponse, который имеет метод с именем GetContentHashCode (), который именно то, что вам нужно. К сожалению, MVC Bundler имеет дурацкую архитектуру, и я готов поспорить, что это все еще внутренний метод. Это означает, что вы не сможете вызвать его из своего кода.

Я попытаюсь изучить это пространство имен, когда вернусь домой (на моем устройстве для разработчиков)

----- Обновление ----

Спасибо за подтверждение. Похоже, у вас есть несколько способов достичь своей цели:

1) Вычислите хэш самостоятельно, используя тот же алгоритм, что и ASP Bundler

2) Используйте рефлексию для вызова внутреннего метода Bundler

3) Получите URL-адрес из компоновщика (для этого, я полагаю, есть публичный метод) и извлеките строку запроса, затем извлеките из нее хеш (используя любые методы извлечения строк)

4) Злиться на Microsoft за дерьмовый дизайн

Давайте перейдем к # 2 (будьте осторожны, так как он помечен как внутренний и не является частью публичного API, переименование метода командой Bundler вас сломает)

//This is the url passed to bundle definition in BundleConfig.cs
string bundlePath = "~/bundles/jquery";
//Need the context to generate response
var bundleContext = new BundleContext(new HttpContextWrapper(HttpContext.Current), BundleTable.Bundles, bundlePath);

//Bundle class has the method we need to get a BundleResponse
Bundle bundle = BundleTable.Bundles.GetBundleFor(bundlePath);
var bundleResponse = bundle.GenerateBundleResponse(bundleContext);

//BundleResponse has the method we need to call, but its marked as
//internal and therefor is not available for public consumption.
//To bypass this, reflect on it and manually invoke the method
var bundleReflection = bundleResponse.GetType();

var method = bundleReflection.GetMethod("GetContentHashCode", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);

//contentHash is whats appended to your url (url?###-###...)
var contentHash = method.Invoke(bundleResponse, null);

Переменная bundlePath - это то же имя, которое вы дали пакету (из BundleConfig.cs)

Надеюсь, это поможет! Удачи!

Изменить: Забыл сказать, что было бы неплохо добавить тест вокруг этого. Тест проверит наличие функции GetHashCode. Таким образом, в будущем, если внутреннее устройство Bundler изменит тест, произойдет сбой, и вы узнаете, в чем проблема.

ответил Frison Alexander 21 J000000Tuesday15 2015, 18:17:06

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132