2013-02-02 10 views
27

Próbuję uzyskać następujące (i podobne) adresy URL do pracy w moim ASP.net MVC4 projektu/WebAPI:trasa ASP.net MVC4 WebAPI z nazwy pliku w to

http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll 

Trasa odpowiedzialnej dla tego adresu URL wygląda następująco:

 config.Routes.MapHttpRoute(
      name: "Nav", 
      routeTemplate: "api/nav/{project}/{assembly}/{namespace}/{type}/{member}", 
      defaults: new { controller = "Nav", assembly = RouteParameter.Optional, @namespace = RouteParameter.Optional, type = RouteParameter.Optional, member = RouteParameter.Optional } 
     ); 

Działa dobrze, jeśli usunę. w nazwie pliku lub jeśli dodaję ukośnik za adresem URL, ale oznacza to również, że nie mogę użyć metody Url.Route -metody itp. Błąd, który otrzymuję, to ogólny błąd 404 (zdjęcie poniżej).

enter image description here

Próbowałem dodanie <httpRuntime targetFramework="4.5" relaxedUrlToFileSystemMapping="true" /> do mojego web.config, a ja też próbowałem dodając

<compilation debug="true" targetFramework="4.5"> 
    <buildProviders> 
    <remove extension=".dll"/> 
    <remove extension=".exe"/> 
    </buildProviders> 
</compilation> 

I żaden z nich wydaje się działać. Moje pytanie brzmi w zasadzie, jak mogę uruchomić ten URL i poprawnie mapować?

+0

Tylko ostatnia część trasy może być opcjonalna. W pokazanym przykładzie wykonałeś wszystkie parametry trasy z wyjątkiem projektu opcjonalnego, co oczywiście nie jest możliwe. Również w adresie URL, który pokazałeś, brakuje fragmentów adresu "namespace" i "type". Tylko część 'member' może być opcjonalna, ponieważ jest zdefiniowana na końcu trasy. –

+0

To nie jest prawda, a udowodniono, że działa bez problemów. Możesz mieć dowolną liczbę części, jak chcesz. Na przykład, nawet przed zmianą, którą właśnie wprowadziłem w mojej odpowiedzi, URL '/ api/nav/SpotiFire' działał jako urok. – Alxandr

Odpowiedz

42

można dodać następującą procedurę obsługi do sekcji <handlers> swojej <system.webServer>:

<add 
    name="ManagedDllExtension" 
    path="api/nav/*/*.dll" 
    verb="GET" 
    type="System.Web.Handlers.TransferRequestHandler" 
    preCondition="integratedMode,runtimeVersionv4.0" 
/> 

Spowoduje to, że wszystkie żądania zawierające .dll będą obsługiwane przez zarządzany potok. Zwróć też uwagę, że ograniczyłem je tylko do czasownika GET, aby ograniczyć wpływ na wydajność.

+0

Genialny, nie powinno się tego "" pokrywa to już? Nie jestem pewien, co obejmuje "*." – Alxandr

+2

Nie, to nie pokrywa tego.Musisz określić rozszerzenie.Jeśli istnieje w adresie URL rozszerzenie, IIS przejmie myślenia że jest to plik statyczny: –

+1

+1 za pokazanie prawidłowego sposobu wykonania tej czynności –

10

Znaleziono. Co jest potrzebne, jest to (a może niektóre rzeczy dodałem powyżej w oryginalnym poście):

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true" /> 
</system.webServer> 
+2

Nie polecam dodawania tego, ponieważ będzie to miało zły efekt uboczny => wszystkie żądania będą teraz przechodzić przez zarządzany potok, co będzie miało negatywny wpływ na wydajność twojej aplikacji. –

+0

Prawda, może uda mi się znaleźć lepsze rozwiązanie na czas, jednak już ponad 90% żądań to żądania zarządzane, więc nie sądzę, aby wynik był zbyt duży ... Jedyne, co nie jest " t ładowane przez zarządzany potok są obrazami i mam około 2 z nich na całej mojej stronie ... – Alxandr

+1

Sprawdź moją odpowiedź na poprawny sposób zrobienia tego bez aktywacji 'runAllManagedModulesForAllRequests =" true "'. –

0

Moja oferta dotyczy dodania /end do końca trasy. . są ignorowane przed ostatnim /.

Odpowiednikiem adresu URL będzie http://127.0.0.1:81/api/nav/SpotiFire/SpotiFire.dll/end.

Zaletą jest to, że nie masz wpływu na skuteczność swoich aktywów.

+0

Wkurza się, gdy otrzymujesz negatywny głos, bez powodu. – kim3er

+0

To zadziałało dla mnie i było najprostszym rozwiązaniem , chociaż właśnie dodałem '/' na końcu. –