2017-05-17 4 views
1

Ich habe eine ASP-MVC-5-Website mit der folgenden Route entwickelt:Warum bricht das URL-Routing ab, wenn ich Parameter verwende?

public static void RegisterRoutes(RouteCollection routes) 
{ 
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

    routes.MapRoute(
     name: "Default", 
     url: "{controller}/{action}/{language}", 
     defaults: new 
     { 
      controller = "Member", 
      action = "Index", 
      language = UrlParameter.Optional 
     }); 
} 

Ich habe nur, dass ein Controller, Mitglied, und alles auf IISExpress auf meiner lokalen Dev-Maschine funktioniert laufen. Aber wenn ich versuche, die Site auf meinem Entwicklungsserver bereitzustellen und auf sie zuzugreifen, erhalte ich den Fehler 404. Die URL, die ich an sie übergebe, ist identisch mit der, die ich auf dem Entwicklungscomputer verwende, aber es scheint, als ob das Routing nicht wie erwartet funktioniert. Hier ist ein Beispiel URL:

http://myserver:8080/Member/GetCertificate/en-US?mn=MjMzOTA3MDc4MDA=&gn=NjcwNzkz

Dies ist der einzige Weg auf meiner Anwendung registriert, und ich habe versucht, den Wildcard-Skript auf IIS zu registrieren, sowie die Bearbeitung meinen Web-Config mit der folgende Einträge:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
     <remove name="UrlRoutingModule-4.0"/> 
     <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" preCondition=""/> 
    </modules> 
    </system.webServer> 

Auf dem Entwicklungsserver wird IIS 7.5 ausgeführt. Ich habe versucht, die Seite von meinem Entwicklungscomputer sowie lokal von dem Webserver remote zuzugreifen, ohne Glück. Hier ist, was die Aktionsmethode wie für Referenz aussieht:

[HttpGet] 
    public FileResult GetCertificate(string language, string mn, string gn) 
    { 
     var member = new Member() 
     { 
      MemberNumber = Encoding.Default.GetString(
       Convert.FromBase64String(mn)), 
      GroupNumber = Encoding.Default.GetString(
       Convert.FromBase64String(gn)), 
      Language = language 
     }; 

     var certificate = this.certificateRepository 
      .GetCertificateDocument(member); 

     return this.File(certificate, "application/pdf"); 
    } 

Ich habe das Debuggen es weiter, und ich fand, dass das Problem scheint zu sein, dass es die Aktion als Controller ist zu erkennen, so dass, wenn ich die URL folgen, es funktioniert:

http://myserver:8080/Member/Member/GetCertificate/en-US?mn=MjMzODU1NjE5MDE=&gn=NzkxMjgz

Aber ich am Ende den Namen des Controllers zu wiederholen, die für eine nicht so lesbar URL macht. Wie auch immer? Vielleicht habe ich etwas verpasst?

+0

eine öffentliche URL an die Entwickler-Website Gibt es? Welche Version von IIS verwenden Sie? Dies ist nur ein Schuss in die Dunkelheit http://stackoverflow.com/questions/8010911/asp-net-mvc-routes-work-locally-but-not-remotely – Ernesto

+0

Wie sieht Ihre Aktion aus? Sieht so aus, als ob in diesem Querystring genau vor dem Ampersand ein zusätzliches Gleichheitszeichen steht. – sleeyuen

+0

Ich habe den Code für die Aktion hinzugefügt und ich glaube, dass der Webserver IIS 7.5 ausführt. Es ist kein Hostname für die Site registriert, aber ich greife über das Netzwerk mit dem Servernamen oder der IP-Adresse darauf zu.Das Gleichheitszeichen ist Teil des Parameters und verursacht keine Probleme, wenn ich die Anforderungen an meinen Entwicklungscomputer stelle. – Kross

Antwort

0

Das Problem war, dass meine Anwendung in IIS einen Namenskonflikt mit meinem Controller hatte. Die Struktur in meinem IIS war wie folgt:

  • MemberSite
    • Mitglied
    • Mitgliederservice

Und der Controller in meiner MVC-Anwendung wurde auch MemberController genannt. Dies führte zu Verwirrung, weil ich dachte, dass ich den Controller referenzierte, als ich tatsächlich auf die Anwendung selbst Bezug nahm. Also für die Lesbarkeit, umbenannt ich die Anwendung in IIS MemberApp und die endgültige URL sieht wie folgt aus:

http://myserver:8080/MemberApp/Member/GetCertificate/en-US?mn=MjMzODU1NjE5MDE=&gn=NzkxMjgz

Verwandte Themen