MVC WebAPI Javascript возможна междоменная проблема

0

Я в процессе создания 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, но есть другие решения, на которые я могу обратить внимание; это просто тестовое приложение, так что пока я вижу ответ, все, что мне нужно.

Еще раз спасибо за вашу помощь.

  • 0
    Домен, к которому относится ваш ajax-запрос, отличается от домена, на котором запущено приложение? Если нет, то это не CORS. Но можете ли вы опубликовать заголовки Request и Response из ваших инструментов F12 (или Fiddler) для неудачных вызовов, это может дать больше подсказки ...
  • 0
    Мониторинг трафика с помощью Fiddler @ stephen-byrne - в Fiddler я вижу, что вызов ajax, выполненный с помощью вызова jQuery, успешно выполняется с ответом 200 и фактическими данными: HTTP / 1.1 200 OK Cache-Control: no-cache Pragma: no-cache Тип контента: приложение / JSON; charset = utf-8 Истекает: -1 Сервер: Microsoft-IIS / 7.5 X-AspNet-Version: 4.0.30319 X-Powered-By: ASP.NET Access-Control-Allow-Methods: POST, GET, OPTIONS, PUT, УДАЛИТЬ Access-Control-Allow-Origin: * Access-Control-Allow-Headers: аутентифицировать, принять, источник, авторизация, тип контента Дата: воскресенье, 27 октября 2013 10:01:10 GMT Длина контента: 877
Показать ещё 12 комментариев
Теги:
asp.net-mvc
asp.net-web-api

1 ответ

0
Лучший ответ

Как упоминалось выше, проблема была связана с vkbeautify - по какой-то причине она не работала с удаленными данными; но работала нормально, когда работала локально.

Теперь я удалил вызовы в эту библиотеку javascript, и только там можно было распечатать возвращаемые данные JSON или XML.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню