Вы можете запросить и получить JSONP ТОЛЬКО ЕСЛИ веб-сервис вы ударяете настроен для междоменного доступа, так что ваш Аякса вызов должен быть правильным и вебсервис должен быть правильно.
Аякса вызов
$.ajax({
type: "GET",
cache: false,
dataType: 'jsonp',
// we are setting base_url at the top, like http://www.MyDomain.com/MyPage.svc/
url: base_url + "GetGfeQuote?strJsonRequestObject=" + JSON.stringify(LoadedGetQuoteObject()),
contentType: "text/plain",
success: function (theJson) {
// I make sure I got json
if (theJson.indexOf('{') > -1) {
glb_the_quote = $.parseJSON(theJson);
if (glb_the_quote.errorMessage.length == 0) {
PopulateResultsPage();
} else {
alert('There was an error getting the quote: ' + glb_the_quote.errorMessage);
}
} else {
alert(theJson)
}
},
error: function (req, status, error) {
if(status == "timeout"){
ShowNoInternetConnectionWarning();
} else {
alert("There was an internet error = " + status + ", " + error);
}
},
// this gives the webservice 7 seconds to return
timeout: 7000
});
// end ajax;
Сейчас вебсервис: В какой-то момент казалось, что я должен был иметь веб-конфигурации, правильно настроить, в том же директории, что и код WebService - в SVC-файл - так что это то, что я делаю.
Это все, что я положил в мой SVC файл:
<%@ ServiceHost Language="C#" Factory="System.ServiceModel.Activation.WebServiceHostFactory" Debug="true" Service="gfeWebService.ws.wsGfe" CodeBehind="wsGfe.svc.cs" %>
И WebConfig должен иметь такие вещи, как следующее (обратите внимание crossDomainScriptAccessEnabled = "истинный")
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="webHttpBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
</webHttpBinding>
</bindings>
<!-- the names have to be fully qualified. If you get an error that says, I can't find blah blah, you don't have the names right -->
<services>
<service name="gfeWebService.ws.wsGfe">
<endpoint address=""
binding="webHttpBinding"
bindingConfiguration="webHttpBindingWithJsonP"
contract="gfeWebService.ws.IwsGfe"
behaviorConfiguration="webHttpBehavior"
>
</endpoint>
</service>
</services>
</system.serviceModel>
Советы
положил точку останова в вас код js возле строки url: возьмите значение, которое заканчивается в URL: ... другими словами, захватить, как это решает
base_url + "GetGfeQuote? StrJsonRequestObject =" + JSON.stringify (LoadedGetQuoteObject())
и вставить его в адресную строку вашего браузера. Таким образом вы получаете более значимое сообщение об ошибке.
- У Fiddler работает, пока вы работаете над этим, и проверьте, что отправляется n.
НТН
Установка 'crossDomain: true' не будет работать магически, если заголовок CORS не установлен на хосте. Это должно быть автоматически обнаружено. –
Возможный дубликат [JQuery ajax cross domain] (http://stackoverflow.com/questions/3506208/jquery-ajax-cross-domain) – Nix
@AndrewMao ok не уверен, что заголовок CORS, но у меня есть много других скриптов, которые работа перекрестного домена, и единственная разница, которую я вижу, заключается в том, что существует тип данных обратного вызова и jsonp datatype –