Heyya,Ajax Web Service Call - No 'Access-Control-Allow-Origin' intestazione è presente
So che questo problema è stato fatto prima e ho letto ogni singola risposta di ogni singola domanda qui, ma ancora non sembra che il mio progetto funzioni correttamente. Il mio scenario è un po 'diverso rispetto ad altre domande, non so se questo faccia qualche differenza, ma qui andiamo.
Ho un progetto fatto di servizi web. I servizi da soli funzionano bene, non ci sono problemi con questo. E c'è un altro progetto che gestisce l'interfaccia utente delle cose e chiama questi servizi tramite jquery ajax. Ha funzionato bene perché non ho ancora testato questo caso su Google Chrome. Tutto funziona perfettamente su Internet Explorer.
Ora; la mia applicazione di servizio Web viene eseguita sulla porta 40000 (localhost: 40000) e il progetto dell'interfaccia utente viene eseguito su un'altra porta casuale ma ancora nell'host locale. Come ho detto, le mie chiamate ajax ecc funzionano perfettamente su Internet Explorer ma quando si tratta di Google Chrome fallisce. La console mostra il seguente errore:
XMLHttpRequest cannot load http://127.0.0.1:40000/abc.asmx/TheMethodName. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:17256' is therefore not allowed access. The response had HTTP status code 400.
Tra l'altro, è stato come "localhost: 40000" prima così alcuni post su internet ha suggerito che dovrei cambiare a un indirizzo IP invece di localhost.
In ogni caso, ho anche modificato il mio file web.config sul mio progetto di servizio web e ha aggiunto il seguente (che non ha alcun senso)
<system.serviceModel>
<bindings>
<webHttpBinding>
<binding name="crossDomain" crossDomainScriptAccessEnabled="true">
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http://localhost:17256" />
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
<add name="Access-Control-Max-Age" value="1728000" />
</customHeaders>
</httpProtocol>
</system.webServer>
BTW, se uso la prima riga: si fallisce completamente e dice che i messaggi dell'intestazione di risposta non corrispondono e non riesco neanche a iniziare il richiamo del servizio.
E sì, ho anche modificato il mio chiamata ajax, aggiunto il seguente parametro:
crossDomain: true,
Ora, che cosa mi manca qui? Sono stato su questo per giorni e sto per perdere la testa :) È troppo tardi per cambiare l'intera struttura del progetto (servizio - stile dell'interfaccia utente intendo) poiché sono stati scritti un sacco di codice per i servizi e Progetti di interfaccia utente Per favore aiutami Sono disperato! :)
Acclamazioni
Edit:
Così si scopre che ho bisogno di usare JSONP, non JSON - dal momento che non venga bloccato con cosa Access Control, che va bene . Posso convertire le mie chiamate Ajax in quelle JSONP. Ma ho bisogno di un altro aiuto :)
Ho scritto un metodo globale Ajax che viene chiamato da ogni operazione su pagine separate e funziona come fascino (di nuovo su Internet Explorer ovviamente). Ora cosa dovrei fare per convertire questa funzione wrapper in qualcosa di jsonp?
function RemoteCall(WebService, RemoteMethod, RemoteParameters, callbackResult) {
if (RemoteParameters == null || RemoteParameters == "") {
RemoteParameters = "{ }";
}
var remoteCall = $.ajax({
type: "POST",
url: ProvideService(WebService, RemoteMethod),
data: RemoteParameters,
contentType: ajaxContentType,
dataType: ajaxDataType,
async: true,
crossDomain: true,
success: function (msg) {
msg.header("Access-Control-Allow-Origin", "*");
callbackResult(msg.d);
},
error: function (xhr, ajaxOptions, thrownError) {
callbackResult(xhr.status + '\r\n' + thrownError + '\r\n' + xhr.responseText);
}
});
}
ho visto alcuni post che avrei dovuto aggiungere una proprietà come jsonp: 'jsonp_callback' con il metodo di callback (questo è dove sono confuso). Che dire di questo?
Un'altra cosa; Mi hanno inviato i miei parametri JSON come un testo in una variabile come
var jSONParams = '{ UserID: "1", EmailAddress: "[email protected]" }';
Devo continuare a inviare questo come lo stesso formato o dovrebbe essere convertito in una sorta di oggetto JSON o qualcosa del genere?
BTW: la mia funzione ajax globale è in un file JS completamente separato - non so se si fa alcuna differenza se ...
Acclamazioni
sul serio nessuno? –
L'endpoint utilizza qualsiasi tipo di autenticazione? Autenticazione di Windows, ecc.? –