2013-06-27 10 views
16

sto avendo la chiamate AJAX al mio controller nella mia MVC ApplicationAJAX chiamata di ritorno 404 opere (locali) in IIS 7.5, ma anche in altri IIS

Controller/FunctionName 



$.ajax({ 
     type: "GET", 
     contentType: "application/json; charset=utf-8", 
     url: '/Controller/FunctionName', 
     . 
     . 
     . 
     )}; 

sto usando MVC 4 e facendo uso di JQUERY Ajax funzione come illustrato nel codice sopra. Funziona perfettamente quando corro da Visual Studio.

Ho eseguito il depolyment sul server e, come previsto, funziona correttamente. Nessun problema riscontrato nelle chiamate AJAX.

Ora sto cercando di distribuire questo nella mia macchina locale IIS che è lo stesso come il mio versione server (IIS 7.5) ma sto ottenendo 404 per tutte le chiamate Ajax nel Firebug.

Ho verificato la compilazione e anche ho indicato la mia cartella web e sto ancora cercando cosa è andato storto !!

Funziona in altri IIS quindi non sarà un problema di risoluzione degli URL. Mi mancano alcune impostazioni o qualsiasi idea tempestiva per risolvere questo sarebbe fantastico.

Grazie

risposta

32

è normale. Hai hardcoded l'URL per la vostra azione di controllo:

url: '/Controller/FunctionName', 

Se si distribuisce l'applicazione in una directory virtuale in IIS l'URL corretto dovrebbe essere:

url: '/YourAppName/Controller/FunctionName', 

Questo è il motivo per cui si dovrebbe assolutamente mai hardcode URL in un'applicazione ASP.NET MVC ma usare sempre aiutanti URL per generare esso:

url: '@Url.Action("FunctionName", "Controller")', 

e se questa chiamata AJAX è in un file JavaScript separato dove si non è possibile utilizzare gli helper lato server, quindi potresti leggere questo URL da qualche elemento DOM che stai facendo AJAXifying.

Per esempio supponiamo che hai avuto un ancoraggio:

@Html.ActionLink("click me", "FunctionName", "Controller", null, new { id = "myLink" }) 

che AJAXify:

$('#myLink').click(function() { 
    $.ajax({ 
     url: this.href, 
     contentType: 'application/json; charset=utf-8', 
     type: 'GET', 
     . 
     . 
     . 
    )};  
    return false; 
}); 

Notate come stiamo leggendo l'URL dal elemento DOM che è stato generato da un aiutante.

Conclusione e 2 regole pratiche:

  • MAI hardcode un URL in un'applicazione ASP.NET MVC
  • ASSOLUTAMENTE SEMPRE aiutanti utilizzare l'URL quando si tratta con gli URL in un ASP.NET Applicazione MVC
+1

Totalmente d'accordo con te @Darin. Come funziona in un IIS ma non in un altro? – user2067567

+0

@Darin Stessa domanda. Se funziona in un altro IIS, perché non nell'altro? – Peru

+1

Dipende dal modo in cui l'applicazione è configurata, indipendentemente dal fatto che sia distribuita direttamente in un sito Web o come directory virtuale. –

0

Quello che ho trovato sul mio setup di IIS7.5 è che il 'Gestore di mappatura' ha una risorsa chiamata 'OPTIONSVerbHandler' non è impostata nell'ordine giusto gallina ce ritorno come sconosciuto.

Questo lavoro per me dove il mio localhost ajax stava chiamando il mio server di rete, che ha un nome diverso, che non dovrebbe darmi un problema CORS, ma lo ha fatto e questa era la mia soluzione.

Aprire IIS e fare clic sul nome del server nel riquadro di sinistra. Nel riquadro destro, fare doppio clic su "Mappature gestori" nel riquadro centrale. Nel riquadro di destra, selezionare "Visualizza elenco ordinato". Da lì trovi 'OPTIONSVerbHandler' e 'svc-ISAPI-4.0_32bit', sposta 'OPTIONSVerbHandler' fino a quando non è sopra 'svc-ISAPI-4.0_32bit'.

Assicurati che il tuo "gestore" all'interno della tua chiamata ajax non contenga "Access-Control-Allow-Origin".

0

Solo un complemento di Darin's answer che se "la chiamata AJAX è in un file JavaScript separato dove non è possibile utilizzare aiutanti lato server", usare un campo nascosto per memorizzare l'endpoint URL nella vista:

@Html.Hidden("URLEndpointName", Url.Action("FunctionName", "Controller")) 

e leggi quel campo nascosto nel tuo js:

url: $("#URLEndpointName").val(),