2012-06-11 7 views
8

Natknąłem się na klejnot this, który wydawał mi się bliski temu, co chciałem. Jednak chcę używać już napisanych kontrolerów ze zbioru referencyjnego.Samodzielna aplikacja WebAPI odwołująca się do kontrolera z innego zespołu

Moim pierwszym krokiem było odesłanie do zespołu, ustawienie zasad routingu tak samo, jak pierwotny projekt webAPI i przejście, ale dostaję 400 za każdym razem, gdy próbuję wywołać usługę hostowaną samodzielnie. Wybrałem odmiany z prośbą z Fiddler i poza różnicami adresowymi, wnioski dotyczące projektu webAPI i projektu hostowanego są identyczne.

Uważam, że powinno to być stosunkowo proste, ale nie znalazłem akceptowalnej odpowiedzi.

+0

Ponieważ PO wyraźnie porzucił to pytanie, czy ktoś jeszcze potwierdził któreś z proponowanych rozwiązań? –

+0

Nie porzucony, nigdy nie udało mi się rozwiązać problemu z wersją danego WebAPI. – Ross

+1

Właśnie zweryfikowaliśmy sugestię autorstwa @pispress i działa ona zgodnie z opisem. Dzięki. –

Odpowiedz

5

To wydaje się być znanym problemem. Musisz wymusić .NET, aby załadować złożenia z potrzebnymi kontrolerami.

Przed samodzielnym hostowaniem interfejsu API sieci Web należy pobrać typ ze zespołu odniesienia, który ma zostać załadowany przez środowisko wykonawcze. Coś takiego:

Type controllerType = typeof(ReferencedControllers.ControllerType); 

To powinno załadować sterowniki z tego zestawu i nie spowoduje błędu 404.

+0

Potwierdziłem, że to jest poprawna informacja. Moje kroki: (1) Utwórz nowy projekt MVC4, (2) Utwórz nowy projekt biblioteki klas, (3) dodaj MVC4 WebAPI Pakiet NuGet do biblioteki klas Projekt (4) odniesienie Biblioteka klasy z projektu WWW (5) Dodaj kontroler interfejsu API do klasy Projekt biblioteki (5) Zmodyfikuj '' 'Application_Start''' za pomocą linii podobnej do powyższego kodu. Jestem w stanie przejść do kontrolera webapi zdefiniowanego w projekcie biblioteki klas, wszystkie żądania działają zgodnie z oczekiwaniami. –

+0

Wydaje się działać z bieżącą wersją interfejsu WebAPI. Dzięki, Shaun! – Ross

+0

dla Twojej uwagi, linia: Type controllerType = typeof (ReferencedControllers.ControllerType); działa tylko w trybie debugowania, w momencie premiery optymalizacja go ignoruje. – Janushirsha

3

ten link zapisany mój dzień dla tego samego problemu:) ...

po prostu trzeba zmienić poniżej rachunku dostosowane do konfiguracji selfhost WebAPI.

GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver()); 

z

var config = new HttpSelfHostConfiguration("http://localhost:8081"); 
     config.Services.Replace(typeof(IAssembliesResolver), new CustomAssemblyResolver()); 
+0

Ten link uratował dzień ..... Mam "proste przykłady" MS, które niczego nie warstwują . Dzięki! – granadaCoder

8

poprzednich postach o Praveen i Janushirsha prowadzi mnie w dobrym kierunku wznowić tutaj:

// Not reliable in Release mode : 
Type controllerType = typeof(ReferencedControllers.ControllerType); 

Tak, należy wymienić IAssembliesResolver z:

HttpConfiguration config = new HttpConfiguration(); 
config.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver()); 

Oto przykład realizacji dla CustomAssembliesResolver

using System.Web.Http.Dispatcher; 
internal class CustomAssembliesResolver : DefaultAssembliesResolver 
{ 
    public override ICollection<System.Reflection.Assembly> GetAssemblies() 
    { 
     var assemblies = base.GetAssemblies(); 

     // Interestingly, if we push the same assembly twice in the collection, 
     // an InvalidOperationException suggests that there is different 
     // controllers of the same name (I think it's a bug of WebApi 2.1). 
     var customControllersAssembly = typeof(AnotherReferencedAssembly.MyValuesController).Assembly; 
     if (!assemblies.Contains(customControllersAssembly)) 
      assemblies.Add(customControllersAssembly); 

     return assemblies; 
    } 
} 

Ten kod może być łatwo dostosowany jeśli zespoły osób trzecich nie są wymienione lub jeśli chcesz późno montaż wiążące.

Mam nadzieję, że ta pomoc.

+1

To pomogło dużo. Dzięki! To powinna być akceptowana odpowiedź, jak sądzę. –

+0

Dzięki za komentarz. Miło, że mogłem pomóc. –

+0

Staram się zrozumieć twój przykład. Tworzę komponent, który uruchamia usługę webApi. Chcę wprowadzić sterowniki do tej aplikacji zewnętrznej. czy to możliwe? Wydaje się, że magicznie znajduje on kontrolerów w swoim własnym projekcie? (Nie jestem pewien, jak to jest wiążące dla tych ... coś w rodzaju magii odbicia za kulisami) –

Powiązane problemy