Jak mogę zastosować aspekt postsharp do projektu strony internetowej?

Nov 27 2020

Używam prostego postsharp.configpliku:

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.postsharp.org/1.0/configuration">
  <Multicast xmlns:my="clr-namespace:ExceptionAutoSerializer.Aspects;assembly:ExceptionAutoSerializer">
    <my:MethodBoundaryAspect  AttributeTargetTypes="MyTopLevelNamespace.*" />
    <my:MethodBoundaryAspect  AttributeTargetMembers="*ctor*" AttributeExclude="true"/>
    <my:MethodBoundaryAspect  AttributeTargetMembers="get_*" AttributeExclude="true"/>
    <my:MethodBoundaryAspect  AttributeTargetMembers="set_*" AttributeExclude="true"/>
  </Multicast>
</Project>

Cały mój projekt w moim rozwiązaniu znajduje się w przestrzeni nazw MyTopLevelNamespace. I każdy projekt w rozwiązaniu ma poprawnie zastosowany aspekt, z wyjątkiem projektu mojej strony internetowej. Nie znam rozwiązania, ponieważ właśnie dostałem się do zespołu programistów.

Wiem tylko, że chciałbym zastosować aspekt do zajęć w ramach tego projektu i że postsharp wydaje się ignorować ten konkretny projekt. Plik konfiguracyjny znajduje się w src/folderze i powinien być zastosowany do całego projektu.

Upewniłem się, że typy, do których stosuję mój aspekt, znajdują się w przestrzeni nazw określonej w pliku konfiguracyjnym i nie pasują do żadnego z wykluczających wzorców.

Czy dostarczyłem wystarczających informacji? Nie jestem pewien, czy wynika to z tego, że projekt jest projektem strony internetowej, ale nie widzę nic innego.

Edycja : upewniłem się, że dodałem pakiet NuGet do projektu. Próbowałem również ręcznie dodać aspekt z atrybutem do określonej metody tego projektu, ale aspekt nie uruchamia się.

Edit2 : to jest metoda, której używam do testowania:

[MethodBoundaryAspect]
public bool Foo(string bar1, string bar2)
{
            // at runtime test contains indeed one attribute MethodBoundaryAspect
            var test = this.GetType().GetMethod("ValidateUser").GetCustomAttributes(false);
            //here the exception is caught higher up but the "onException" of my attribute doesn't trigger
            throw new Exception("test exception");
}

i mój aspekt post-ostry:

namespace ExceptionAutoSerializer.Aspects
{
    [Serializable]
    public class MethodBoundaryAspect : OnMethodBoundaryAspect
    {

        //[...]

        public override void OnEntry(MethodExecutionArgs args)
        {
            //[...]
        }

        public override void OnSuccess(MethodExecutionArgs args)
        {
            //[...]
        }

        public override void OnException(MethodExecutionArgs args)
        {
            //[...]
        }
    }
}

Odpowiedzi

3 Amon Nov 30 2020 at 21:27

Według starej odpowiedzi programisty z PostSharp Technologies:

Usługa PostSharp jest (obecnie) zintegrowana za pośrednictwem programu MSBuild (o czym wspomniał również John Saunders), która nie jest używana w projektach witryn sieci Web.

Chociaż w swoim rdzeniu PostSharp jest narzędziem wiersza poleceń, pobiera tak wiele informacji z MSBuild, że dość trudno jest sprawić, by działał osobno (i nie jest ani zalecany, ani dokumentowany, ani obsługiwany w pierwszej kolejności). Daniel Balas

Nie znalazłem żadnej aktualizacji na ten temat dla wersji starszej niż 4.3. W przypadku wersji 4.3 i wcześniejszych według poprzedniej odpowiedzi i tej dokumentacji (s. 45) projekt strony internetowej nie jest obsługiwany.

Edit : gdy kwestionując cytowany wcześniej autor o aktualnej ważności odpowiedzą oni odpowiedzieli tym w komentarzu:

@Amon W przypadku stron internetowych bez projektów (których IIRC nie można tworzyć z poziomu interfejsu użytkownika w VS 2017 i późniejszych) jest to nadal prawdą. Jednak wszystkie projekty internetowe, które mają csproj / vbproj (.NET lub .NET Core), działają zgodnie z oczekiwaniami (od tego czasu również się to nie zmieniło). - Daniel Balas