Я в процессе создания WebApi - тестировал локально, и все работает нормально. Развернутый на мой хост-компьютер, и после нескольких проблем обеспечения вызова ajax был использован правильный URL-адрес для доступа к webapi, я столкнулся с проблемой.
Здесь мой код Razor, который показывает вызов jQuery AJAX:
string myUrl = Url.Action("Index","Home", null, Request.Url.Scheme, null);
<script type="text/javascript">
function findByVrm() {
$('#response').text('Searching...');
var uri = '@myUrl' + 'api/vehicle';
var id = $('#vrm').val();
var call = null;
// Setup a 'call' object differently depending upon if we want to return
// JSON data or XML data
if ($('#rbJson').prop('checked')) {
call = {
type: 'GET',
url: uri + '?vrm=' + id
};
} else {
call = {
type: 'GET',
url: uri + '?vrm=' + id,
dataType: 'xml',
accepts: {
xml: 'text/xml',
text: 'text/plain'
}
};
}
// Perform the API call
$.ajax(call)
.success(function (response, textStatus, jqXHR) {
showStatus(jqXHR);
if ($('#rbJson').prop('checked')) {
$('#response').html(vkbeautify.json(response));
$('#status').text('Vehicle Found: '+response.data.idscode);
} else {
$('#response').text(vkbeautify.xml(jqXHR.responseText)); // text version of the XML
}
})
.fail(function (jqXHR, textStatus, err) {
showStatus(jqXHR);
$('#response').text('');
});
}
function showStatus(jqXHR) {
var msg = 'Status: ' + jqXHR.status + '/' + jqXHR.statusText;
$('#status').text(msg);
return;
}
</script>
HTML - это чисто текстовое поле с идентификатором "vrm", это строка поиска, кнопка, вызывающая функцию javascript findByVrm(), которая указывает, должен ли вызов возвращать данные JSON или XML, текстовое поле для отображения статус вызова и текстовое поле для отображения содержимого.
При запуске на localhost это работает отлично. При развертывании на удаленном хост-компьютере и вызове, построенном в Fiddler, он работает отлично.
Однако при просмотре этой страницы на удаленном хост-компьютере и выполнении вызова через указанный выше код... вызывается метод API (у меня есть сообщения журнала, которые показывают, что он был вызван, и что ответ был отправлен обратно), статус обновлено и показывает 200/OK - указывая на то, что вызов преуспел, однако данные JSON или XML, похоже, не были возвращены в этом экземпляре (или если они были возвращены, не отображаются).
Изучив это на stackoverflow и других сайтах, я полагал, что это проблема "кросс-домена", а также другие сообщения о внедрении обработчика CORS - и все же, когда webapi размещен на удаленном сервере и вызывается вышеупомянутый Javascript, Я все еще не вижу ответных данных.
Я взял код обработчика CORS отсюда: обработчик CORS
Есть идеи?
РЕДАКТИРОВАТЬ: В дополнение к сообщению выше и вопросам, указанным ниже - я создал JSFiddle, чтобы увидеть, могу ли я воспроизвести проблему, которую я видел изолированно. Вот скрипка
Fiddle WORKS - однако вышеупомянутый Javascript не работает, поэтому мой первоначальный вывод здесь - это ошибка, вызванная vkbeautify, и, следовательно, бесшумный выход из метода findByVrm().
Я буду выполнять немного больше испытаний на этом; но я хотел бы поблагодарить всех, кто проводил время, глядя на меня со мной.
EDIT: Таким образом, удалив вызов vkbeautify.json() и заменив его на JSON.stringify() и помещая результат этого в текстовое поле - это работает.
Я не уверен, почему vkbeautify работал над данными ответа, когда я запускал его в localhost через Visual Studio, но это не имеет значения - было бы неплохо иметь возможность "печатать" как ответы JSON, так и XML, но есть другие решения, на которые я могу обратить внимание; это просто тестовое приложение, так что пока я вижу ответ, все, что мне нужно.
Еще раз спасибо за вашу помощь.
Как упоминалось выше, проблема была связана с vkbeautify - по какой-то причине она не работала с удаленными данными; но работала нормально, когда работала локально.
Теперь я удалил вызовы в эту библиотеку javascript, и только там можно было распечатать возвращаемые данные JSON или XML.