2017-02-03 2 views
0

У нас есть проект, который использует несколько доменов (с арендаторами), и когда нам нужно сгенерировать абсолютный URL, мы использовали, чтобы сделать это:Вы можете блокировать метод в Mvc библиотеки (или действительно любой класс)

var forgotUrl = Url.Action("Forgot", "Account", null, this.Request.Url.Scheme); 

Это сработало хорошо, и иногда вам нужны абсолютные URL-адреса, например, если вы отправляете электронные письма со ссылками на сброс пароля.


Однако, мы в настоящее время осуществляется SSL с обратного прокси-сервера, не означает, что this.Request.Url.Scheme больше не дает нам правильный домен.

Поэтому мы должны сделать что-то вроде этого вместо

var forgotUrl = CurrentHostWithSchemeWithoutTrailingSlash + Url.Action("Forgot", "Account"); 

Для упрощения мы сделали метод расширения, например, так

Url.AbsoluteAction("Forgot", "Account", *data*) 

И что все работает, как и следовало ожидать, так что все хорошо, тем не менее, вы все равно можете испортить upp, написав строку, вызывающую оригинал Url.Action, и отправку в this.Request.Url.Scheme.

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

+0

Возможный дубликат [Поиск всех ссылок на метод с Roslyn] (http://stackoverflow.com/questions/31861762/finding-all-references-to-a-method-with-roslyn) –

+0

Можете ли вы использовать Resharper ? – Evk

+0

Итак, вы можете использовать производный класс 'Controller' как базу для всех ваших контроллеров и перезаписать свойство' Url'. Для просмотров это выглядит актуальным: [Изменение базового типа вида бритвы] (http://haacked.com/archive/2011/02/21/changing-base-type-of-a-razor-view.aspx/) – spender

ответ

1

Для общего случая, когда метод является членом класса, ваша реальная опция - найти способы использования и код обновления. Вы можете вручную найти все случаи таких функций с «найти все обычаи» (VS или VS + R #) время от времени или использовать автоматизированные инструменты. Если вы используете VS 2015+, см. Finding all references to a method with Roslyn. Для более старых версий или тестов сборки вы можете сканировать код, например. путем добавления модульного теста, который будет загружать сборку, анализировать IL и утверждать неправильные методы.

Для данного конкретного случая Поскольку Url.Action - метод расширения - дополнительная опция заключается в создании другого метода расширения с той же сигнатурой в другом статическом классе, который по умолчанию отображается в представлении (например, namespace System; public static class MyHack{ ...Action(UrlHelper...), поэтому компилятор найдет 2 варианта метод и показать ошибку.

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

Смежные вопросы