OwinStartup nie strzela

350

Kod OwinStartup działał idealnie, a potem przestał działać. Niestety nie jestem pewien, co dokładnie zrobiłem, aby przestał działać i naprawdę trudno mi to rozgryźć.

Aby upewnić się, że mam podstawy, dwukrotnie sprawdziłem, aby upewnić się, że mam

[assembly:OwinStartup(typeof(WebApplication.Startup))] 

atrybut przypisany poprawnie i upewniłem się, że nie mam appSetting for owin: AutomaticAppStartup, który jest ustawiony na false, więc ustawiłem jeden na true, aby był bezpieczny, ponieważ wcześniej nic tam nie było.

<add key="owin:AutomaticAppStartup" value="true" />

Próbowałem także specjalnie wywołać aplikację:

<add key="owin:appStartup" value="WebApplication.Startup" />

Zanim przestał działać, zaktualizowałem pakiety NuGet Microsoft.Owin.Security do wersji 2.0.2, więc próbowałem przywrócić je do wersji 2.0.1 (to był problem), ale nic to nie zmieniło. Mam WebActivator zainstalowany w projekcie i używam go do ładowania innych rzeczy, ale przetestowałem to na nowym szablonie WebApplication i działa tam, więc nie sądzę, że to winowajca.

Próbowałem także usunąć moją klasę startową i użyć programu Visual Studio, aby dodać nową, używając typu klasy startowej OWIN w Dodaj nowy element, ale to też nie jest wywoływane. Następnie próbowałem dodać drugą klasę uruchamiania, ponieważ wiem, że zgłosi wyjątek, jeśli zdefiniowano więcej niż jeden atrybut OwinStartup, ale nie zgłasza tam żadnego wyjątku.

Nie jestem pewien, co jeszcze spróbować. jakieś pomysły?

Aktualizacja

Okazuje się, że Resharper usunął odwołanie do Microsoft.Owin.Host.SystemWeb, kiedy użyłem go do usunięcia nieużywanych odniesień.

Jeff Treuting
źródło
37
Czy masz pakiet Microsoft.Owin.Host.Systemweb zainstalowany w tej aplikacji? Upewnij się, że ta biblioteka DLL jest również częścią folderu bin?
Praburaj,
1
To było to. Dzięki wielkie. Myślę, że to, co się stało, polegało na tym, że użyłem Resharpera, aby usunąć nieużywane referencje w pewnym momencie i nie wydaje mi się, żeby były potrzebne. Jeśli chcesz podać to jako odpowiedź, zdecydowanie oznaczę to jako rozwiązanie. Dzięki za pomoc.
Jeff Treuting
2
Jeff, ReSharper usunął „nieużywane” odniesienie do Microsoft.Owin.Host.Systemweb - czy mówisz o wyrażeniu „za pomocą”? W jakim pliku Startup.cs?
vkelman
4
Miałem dokładnie ten sam problem, resharper usunął odniesienie do Microsoft.Owin.Host.SystemWeb. Naprawiłem to, otwierając okno konsoli Menedżera pakietów w Visual Studio i uruchamiając następującą komendę PM> Update-Package -reinstall Microsoft.Owin.Host.SystemWeb
Joe King
1
Jako aktualizacja powyższego komentarza @ JoeKing. Konsola PM nie aktualizuje się jako „Nie znaleziono”. Musiałem iść na ponowną instalację. PM> Zainstaluj pakiet Microsoft.Owin.Host.SystemWeb
Morvael

Odpowiedzi:

768

Upewnij się, że masz zainstalowany Microsoft.Owin.Host.SystemWebpakiet w projekcie. Ten pakiet jest potrzebny do wykrywania uruchamiania w aplikacjach hostowanych w IIS. Więcej informacji można znaleźć w tym artykule .

Praburaj
źródło
4
W jaki sposób ktoś mógłby programowo uruchomić Owin Startup Detection w obrębie biblioteki używanej / enkapsulującej owin, zakładając, że mamy miejsce, aby to nazwać ( PreApplicationStartMethod ), bez wymagania tych bezpośrednich odniesień do rzeczy Microsoft.Owin? Jak konkretnie sprowokujemy Katanę do połączenia Startup.Configuration(IAppBuilder)?
Jason Kleban
7
Próba utworzenia aplikacji od podstaw, bez korzystania z szablonu MVC. To skończyło się 2 godziny rozpaczy.
mkvlrn
1
Właśnie wtedy, gdy krzyczałem, resharper jest największym zabójcą produktywności, miałem ten problem i przez tydzień nie mogłem zrozumieć, dlaczego interfejs API przestał działać. Kolejnym dowodem na to, że resharper zabija moją produktywność.
Ivan G.,
5
Wymaganie odwołania się do biblioteki, która tak naprawdę nie jest używana podczas kompilacji, jest złym projektem Microsoft! Resharper robi wszystko, co w jego mocy, ale nie ma broni przeciwko tak złym decyzjom.
ps_ttf
22
Niesamowity. Za każdym razem, gdy dodam plik startowy OWIN, mam ten problem. I za każdym razem, gdy zapominam dlaczego, i kończę na tej odpowiedzi.
Tobias
70

Jeśli dokonałeś aktualizacji ze starszej wersji MVC, upewnij się, że nie masz

  <add key="owin:AutomaticAppStartup" value="false" />

w twoim web.config. Pominie to wywoływanie logiki uruchamiania.

Zamiast tego zmień na true

  <add key="owin:AutomaticAppStartup" value="true" />

Zdaję sobie sprawę, że już o tym wspomniałeś, ale czasami ludzie (jak ja) nie czytają całego pytania i po prostu przeskakują do odpowiedzi ...

Gdzieś wzdłuż linii - kiedy uaktualniłem do MVC 5, to zostało dodane i nigdy tego nie widziałem.

Simon_Weaver
źródło
Ten sam problem występował podczas wdrażania klasy startowej Owin w starym projekcie mvc. Zmiana wartości załatwiła sprawę!
Darxtar,
To działa dla mnie Dzięki
Ghanshyam Singh
51

Alternatywna odpowiedź na omawiany pierwotny problem - Owin „nie strzela”. W moim przypadku spędziłem godziny, myśląc, że to nie strzelał, ponieważ nie byłem w stanie ustawić w nim punktu przerwania.

Podczas debugowania uruchamiania OWIN w Visual Studio

  • IIS Express - Uruchomienie „F5” spowoduje uszkodzenie kodu startowego OWIN

  • IIS - Uruchomienie „F5” nie ulegnie awarii, dopóki nie zostanie załadowany kod OWIN (i global.asax). Jeśli podłączysz się do W3P.exe, będziesz mógł do niego wejść.

Aaron Sherman
źródło
2
masz rację! To tylko debuger programu Visual Studio 2013, który nie zatrzymuje się w punkcie przerwania w klasie Autostart - podczas działania w lokalnym IIS. Dziwne.
vkelman
4
Czy możesz rozwinąć „dołącz do W3P.exe”? Mam ten sam problem polegający na tym, że punkt przerwania nie został trafiony przez IIS, ale został uderzony przez IISExpress. Zatrzymałem aplikację, dołączyłem do w3wp.exe, a następnie przeszukałem mój localhost, ale nadal nie został trafiony. Czy coś przeoczyłem?
Sean
Nie mogę również dołączyć do działającej instancji mojej aplikacji, chociaż uważam, że mogłem to zrobić wcześniej. Próbowałem otworzyć aplikację w przeglądarce, a następnie w VS2013, aby użyć opcji „Debuguj-> Dołącz do procesu”, a następnie ponownie załaduj stronę w przeglądarce. VS się nie zatrzymał. Wiem, że OWIN Startup wykonuje się: włączyłem do niego logowanie w celu debugowania. To jest jak w czasach ciemności pośrednich odbitek debugujących.
vkelman,
2
współpracownik właśnie pokazał mi, że w systemie iis po dwukrotnym kliknięciu domyślnej puli aplikacji i zmianie trybu zarządzanego potoku na klasyczny, debugger przestanie działać podczas uruchamiania. Później pobiegłem i dostałem błąd informujący, że aplikacja musiała działać w zintegrowanym, więc musiałem to zmienić, ale przynajmniej mogłem zobaczyć, że tam się psuje.
Matt Bodily,
Jest tu kilka rzeczy. „w3wp.exe” jest oparty na puli aplikacji. powinieneś być w stanie debugować global.asax i owin, jeśli twoja aplikacja nie jest pierwszą aplikacją, o którą prosisz, która uruchamia ten proces. tj. zażądaj innej aplikacji w puli aplikacji „Dołącz do w3wp.exe”, a następnie poproś aplikację o próbę debugowania.
Brett Caswell
26

Jeśli masz problemy z debugowaniem kodu w Startupklasie, również miałem ten problem - lub tak mi się zdawało. Kod był uruchamiany, ale wierzę, że dzieje się to przed dołączeniem debugera, więc nie można ustawić punktów przerwania w kodzie i zobaczyć, co się dzieje.

Możesz to udowodnić, zgłaszając wyjątek w Configurationmetodzie Startupklasy.

Remotec
źródło
dokładnie tak się dzieje. Czy istnieje rozwiązanie umożliwiające uruchomienie klasy startowej po podłączeniu debugera?
Tom Schreck
Czy mogę wiedzieć, jak zgłosić wyjątek w metodzie konfiguracji?
Karthikeyan
1
Dodano tę linię do Startup.cs, aby udowodnić, że została wykonana: System.IO.File.WriteAllText (@ "c: \ temp \ startup.txt", "Started");
RaoulRubin
1
@Karthikeyan - Dodaj tę linię przed przed (nie ma znaczenia) ConifureAuth (aplikacja); linia - wrzuć nowy wyjątek („Hello”);
Francis Rodgers,
Zrób pierwszą linię System.Threading.Sleep (10_000), aby poczekał wystarczająco długo na dołączenie debuggera przed kontynuowaniem (dostosuj w razie potrzeby)
James Gray
16

WSKAZÓWKI DOTYCZĄCE DEBUGOWANIA

Jeśli debugowanie nie działa, spróbuj użyć IIS Express lub wypróbuj poniższą metodę dla lokalnych IIS

Korzystanie z lokalnych usług IIS

Z jakiegoś powodu ta metoda umożliwia debugowanie tej metody:

  1. Poproś o stronę internetową
  2. Dołącz do procesu w3wp.exe
  3. Dotknij pliku web.config
  4. Poproś o stronę internetową

Dodatkowa wskazówka

Może zrobienie tego spowoduje opróżnienie pamięci podręcznej:

  1. W pliku web.config dodaj atrybut optimizeCompilations z wartością false

    <kompilacja debug = "true" ... optimizeCompilations = "false">

  2. Uruchom witrynę

  3. Cofnij zmianę w pliku web.config
Rasmus
źródło
2
przełączanie ustawień optimizeCompilations="false"działa dla mnie
barsh
Ratujesz mój dzień! optimizeCompilations = „false” działa dla mnie.
Vostrugin
optimizeKompilacje uratowały mi dzień. Dzięki :)
Bogdan Stojanovic
13

Miałem podobny problem i usunięcie tymczasowych plików ASP.NET to rozwiązało. Mam nadzieję, że to komuś pomoże.

randomsolutions
źródło
4
Tylko dla odniesienia, oto kolejna odpowiedź, która zawiera trochę więcej szczegółów na temat miejsca przechowywania tych plików: stackoverflow.com/questions/16137457/…
Sam Storie
1
Korzystam z IIS EXPRESS i okna 8: usuń tutaj: C: \ Users \ Twoja nazwa użytkownika \ AppData \ Local \ Temp \ Tymczasowe pliki ASP.NET \ vs
Gray Wolf
Dzięki, zauważyłem tę odpowiedź, ponieważ miałem wcześniej błąd, dotyczący czegoś blokującego plik w folderze plików tymczasowych ASP.NET
Elger Mensonides,
Walczyłem z tym przez 1 cały dzień, aż w końcu to zadziałało. Po wyczyszczeniu Temporary ASP.NET Fileszawartości folderu i uruchomieniu Owin uruchomiono.
Harsh Baid
11

Miałem ten sam problem. Pakiet Microsoft.Owin.Host.SystemWeb został zainstalowany, ale podczas instalacji NuGet z jakiegoś powodu nie mógł dodać biblioteki dll jako odniesienia. Upewnij się, że Twój projekt ma takie odniesienie. Jeśli nie, możesz spróbować zainstalować ponownie:

update-package Microsoft.Owin.Host.SystemWeb -reinstall

Miałem błąd jak poniżej przy ponownej instalacji, ale jakoś to zadziałało:

Wywołanie systemowe nie powiodło się. (Wyjątek od HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED))

Ufuk Hacıoğulları
źródło
Walczyłem z tym przez jakiś czas i to właśnie naprawiło mój problem. Miałem odniesienie do nuget w paczkach.config, ale mój csproj nie miał tego odniesienia.
Zackary Geers
1
W moim przypadku pakiet wcale nie został zainstalowany. Uruchomienie pakietu instalacyjnego Microsoft.Owin.Host.SystemWeb rozwiązało mój problem. Dzięki za podpowiedź.
J. Horn
2

W moim przypadku pula aplikacji IIS nie została ustawiona na v4. To było v2.

Zmieniłem AppPool na v4 i wszystko było w porządku.

Szary Wilk
źródło
2

Miałem ten sam problem, kiedy dodałem Owin do istniejącego projektu internetowego. W końcu odkryłem, że problem był spowodowany przez następujące w pliku web.config.

<assemblies>
  <remove assembly="*" />
  <add assembly="System.Web.Mvc" />
  <add assembly="System.Web.WebPages" />

   ...

</assemblies>

Usunięcie zestawu = „*” było przyczyną problemu. Kiedy usuwam ten wiersz, uruchamiany jest kod startowy Owin. W końcu zmieniłem to na następujące i działało idealnie

<assemblies>
  <remove assembly="*" />
  <add assembly="Microsoft.Owin.Host.SystemWeb" />
  <add assembly="System.Web.Mvc" />
  <add assembly="System.Web.WebPages" />
  <add assembly="System.Web.Helpers" />
...
</assemblies>
James Rapson
źródło
1
Miałem projekt sitecore i w moim pliku web.config nie było tagu <remove assembly = * "/>, ale dodanie <add assembly =" Microsoft.Owin.Host.SystemWeb "/> rozwiązało mój problem.
burki
Dzięki @burki, z powodu twojego komentarza zmusiłem się do wypróbowania tego rozwiązania, które również zadziałało dla nas! Klasa startowa Owin nie odpalała od czasu aktualizacji VS do 15.9.9.
David
Dziękuję bardzo! to naprawiło to, musiałem dodać następujący link: <assemblies> <remove assembly = "*" /> <add assembly = "myapplication" /> <add assembly = "Microsoft.Owin.Host.SystemWeb" /> <dodaj zestaw = "Microsoft.Owin.Security" /> <dodaj zestaw = = System.Web.Mvc "/> <dodaj zestaw =" System.Web.WebPages "/> <dodaj zestaw =" System.Web.Helpers "/> < / assemblies>
trykyn
1

W moim przypadku ścieżka wyjściowa mojej witryny jest przez kogoś zmieniana, IIS Express nawet nie ładuje OWIN, a klasa instalacyjna oczywiście nie zostanie trafiona. Po ustawieniu ścieżki wyjściowej jako „bin \” działa to dobrze.

Sean Song
źródło
1

W moim przypadku ten pakiet Microsoft.Owin.Host.SystemWeb jest obecny w projekcie.

Ale poniżej dwóch tagów nie ma w pliku web.config.

<add key="owin:AutomaticAppStartup" value="true" />
<add key="owin:appStartup" value="namespace.className.methodName" />

po ich dodaniu działa płynnie.

WĄTEK
źródło
1

W moim przypadku mój web.config miał

<authorization>
  <allow users="?" />
</authorization>

Musiałem to zrobić, aby zmusić go do powrotu do Owina

<authorization>
  <deny users="*" />
</authorization>
sirdank
źródło
0

Pomieszałem z wieloma sugestiami dotyczącymi tego postu.

Miałem następujące, ale nadal nie mogłem wylądować w punkcie krytycznym. Zgłoszenie wyjątku potwierdziło, że kod jest wprowadzany.

<appSettings>
...
  <add key="owin:AutomaticAppStartup" value="true" />
  <add key="owin:appStartup" value="SSOResource.Startup, SSOResource" />
...
</appSettings>

W końcu z desperacji spojrzałem na właściwości project>, a następnie w sekcji WEB zaznaczyłem również pole wyboru NATIVE CODE (ASP.NET powinien być już zaznaczony).

To ostatecznie mnie naprawiło.

Uwaga: używam programu Visual Studio 2017 Professional.

Anthony De Souza
źródło
0

Nie jestem pewien, czy to nadal komuś pomoże, ale zrobiłem wszystkie powyższe rozwiązania (i niektóre inne posty) bezskutecznie.

Tym, co naprawiło problem po mojej stronie, było umieszczenie odwrotnego ukośnika na końcu wartości RedirectUri w pliku web.config (szalone, wiem!). RedirectUri jest parametrem w UseOpenIdConnectAuthentication.

Zamiast więc:

<add key="ida:RedirectUri" value="https://www.bogussite.com/home" />

Zrób to:

<add key="ida:RedirectUri" value="https://www.bogussite.com/home/" />

I zaktualizowałem również adres URL odpowiedzi w ustawieniach aplikacji Azure.

To w jakiś sposób sprawiło, że Autostart działał zgodnie z oczekiwaniami (prawdopodobnie wyczyścił pamięć podręczną), a punkty przerwania są teraz uruchamiane.

Do Twojej wiadomości Modelowałem swój kod stąd: https://github.com/microsoftgraph/aspnet-connect-sample

niki b
źródło
0

Po przekonwertowaniu biblioteki klas na projekt aplikacji sieciowej wpadłem na to i uparłem się. Okazało się, że w moim .csProjpliku miałem to:

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  <DebugSymbols>true</DebugSymbols>
  <DebugType>full</DebugType>
  <Optimize>false</Optimize>
  <OutputPath>bin\Debug\</OutputPath>
  <DefineConstants>DEBUG;TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  <DebugType>pdbonly</DebugType>
  <Optimize>true</Optimize>
  <OutputPath>bin\Release\</OutputPath>
  <DefineConstants>TRACE</DefineConstants>
  <ErrorReport>prompt</ErrorReport>
  <WarningLevel>4</WarningLevel>
</PropertyGroup>
  • w ten sposób budowanie różnych bibliotek dll w podfolderze folderu bin (który ifc. nie będzie działał). Rozwiązaniem była zmiana obu treści tekstowych na OutputPathjust bin\.
Frederik Struck-Schøning
źródło
0

Dla mnie to dlatego, że nie są w tej samej przestrzeni nazw. Po usunięciu mojego AppStart z „project.Startup.AppStart” i pozwoleniu im zarówno Startup.cs, jak i Startup.Auth.cs z przestrzenią nazw „project.Startup” wszystko wróciło do normy.

Mam nadzieję, że to pomoże!

Fábio Carvalho
źródło
0

Jeśli widzisz ten problem z hostingiem IIS, ale nie podczas debugowania F5, spróbuj utworzyć nową aplikację w IIS.

Naprawiłem to dla mnie. (Windows 10) Ostatecznie usunąłem „złą” aplikację IIS i odtworzyłem identyczną o tej samej nazwie.

pmb5
źródło
0

Myślę, że niektórzy ludzie próbowali dostać się wyżej, jeśli chcesz programowo sprawić, by Twój serwer OWIN „ożył”, nazwałbyś coś takiego:

using Microsoft.Owin.Hosting;

    IDisposable _server = WebApp.Start<StartupMethod>("http://+:5000"); 
              // Start Accepting HTTP via all interfaces on port 5000

Gdy wykonasz to wywołanie, zobaczysz wywołanie StartupMethod () w debuggerze

JoeHz
źródło
0

To działało dla mnie:

dodaj tryb uwierzytelniania = „Brak”

<system.web>
    <compilation debug="true" targetFramework="4.6.1" />
    <httpRuntime targetFramework="4.6.1" />
      <authentication mode="None" /><!--Use OWIN-->
  </system.web>
Andrew Gale
źródło
-3

Najpierw dodaj OWIN Auth Class, a następnie włącz OWIN: AutomaticAppStartup w pliku web.config, takim jak Teraz będzie strzelać

Venkatesh Prabu
źródło