2015-06-17 11 views
17

Ho un'applicazione Web che utilizza MVC e AngularJS, che si collega a API Web API 2, che ho impostato in un progetto separato.HTTP Post a Web API 2 - Richiesta di opzioni ricevuta e gestita senza ulteriori richieste ricevute

Attualmente sono in grado di recuperare informazioni dall'API senza problemi.

Tuttavia, quando provo a fare un HTTP Post, non ricevo risposta, originariamente ho riscontrato un problema con la richiesta di pre-volo non riuscita, ora l'ho gestita nel mio controller, tuttavia non invia la richiesta corretta dopo che ha ricevuto un messaggio OK.

Ho incluso il mio codice per la fabbrica angolare e il controller C# nell'API.

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public class RegisterController : ApiController 
{ 
    public string Post() 
    { 

     return "success"; 
    } 

    public HttpResponseMessage Options() 
    { 
     return new HttpResponseMessage { StatusCode = HttpStatusCode.OK }; 
    } 
} 


var RegistrationFactory = function($http, $q, ApiAddress) { 
return function(model) { 
    // $http.post(ApiAddress.getApiAddress() + '/Register/Post', model.ToString()); 

    $http({ 
     method: "POST", 
     url: ApiAddress.getApiAddress() + '/Register/Post', 
     data: model, 
     headers: { 'Content-Type': 'application/json; charset=utf-8' } 
    }).success(function(data) { 
     $location.path("/"); 
    }); 
} 
}; 

RegistrationFactory.$inject = ['$http', '$q', 'ApiAddress']; 

Edit:

non sto ancora avendo alcuna gioia con questo, però ho provato in Internet Explorer e funziona senza problemi a tutti.

Ho funzionato in chrome iniziando con la sicurezza Web disabilitata, ma ovviamente questo non è l'ideale in quanto non funzionerà su un PC utente con sicurezza abilitata.

+0

Funziona in Firefox? – DermFrench

+0

Sì, penso che sia un problema con la sicurezza in Chrome. –

+0

Hai provato a pubblicare su un dominio, ad es. web.domain.com e api.domain.com per vedere se funziona quando si trovano nello stesso dominio? – DermFrench

risposta

4

Vedo che è stato eseguito l'adattamento per CORS sul lato server. Ma non riesco a vedere alcun adattamento lato client (javascript). Potrebbe essere necessario aggiungere il codice qui sotto prima di chiamare il servizio.

$http.defaults.useXDomain = true; 
delete $httpProvider.defaults.headers.common['X-Requested-With']; 

Fammi sapere se questo risolve il problema. Ha funzionato per me in tutti gli scenari :).

saluti Himanshu

+0

È anche necessario aggiungere '$ httpProvider.defaults.withCredentials = true;' – glennanthonyb

1

E 'strano che il vostro ottiene il lavoro, ma i tuoi post non lo fanno.

Si consiglia di eseguire il codice in Google Chrome con sicurezza Web abilitato (in modo che possiamo vederlo andare storto) e con le opzioni di sviluppo F12 mostrato.

Selezionare la scheda Rete, eseguire il codice e osservare cosa succede quando viene chiamato il POST.

Il servizio restituisce uno stato "200 OK" o qualche altro valore?

Viene restituito qualsiasi tipo di risposta?

Potrebbe valere la pena provare questo e aggiungere uno screenshot dei risultati nella domanda originale. È potrebbe aiutare a identificare la causa.

non sto ancora avendo alcuna gioia con questo, però ho provato a Internet Explorer e funziona senza problemi a tutti.

Btw, non si dispone di una singola configurazione roba sign-on nella vostra azienda, vero? Abbiamo riscontrato problemi in cui IE funziona correttamente, ma altri browser non consentono il Single Sign-On. Solo un pensiero ...

0

CORS richiede un preflight OPTIONS che ha intestazioni HTTP nella sua risposta che dicono al browser se è consentito accedere alla risorsa.

E.g. Intestazioni HTTP di risposta:

Access-Control-Allow-Headers: authorization 
Access-Control-Allow-Origin: * 

Perché hai un gestore Opzioni personalizzati nel C# controllo, a quanto pare queste intestazioni HTTP non vengono restituiti, fermando il browser per effettuare la chiamata dopo la verifica preliminare.

Evita il metodo Opzioni e dovresti essere bravo.

Problemi correlati