Может кто-нибудь помочь мне выяснить, почему я не могу получить доступ к своему cfc с помощью запроса ajax, но у меня нет проблем через браузер? - PullRequest
1 голос
/ 14 декабря 2010

Я работаю над простой формой, используя ColdFusion MX7.У меня есть пара текстовых вводов, которые я хочу заполнить на основе того, что выбрано в cfselect.Любые вызовы Ajax в мой CFC возвращают ошибку 404.Если я получаю доступ к CFC из моего браузера, я не получаю такой ошибки.Я сделал это, используя пример Бена Наделя по созданию собственного Java-прокси для cfc.Cfc находится в той же папке, что и страница cfm, на которой находится этот скрипт.Вот соответствующий код:

 function RemoteCFC(){
        this.name = " ";
        return( this );
       }


      // This handles the remote calls to the CFCs.
      RemoteCFC.prototype.MakeRemoteCall = function(strMethod, objData, fnSuccess, fnError){

      // Create a data struct and extend it with the method
      // name and the data to be passed.
      var objRemoteData = {};

      // Extend the remote data set.
      $.extend(objRemoteData, objData, {method: strMethod, returnFormat: "json"});
      // Make the AJAX call to the remote method.
      $.ajax({type: "get", url: (this.Name + ".cfc"), data: objRemoteData, dataType: "json", 
             success: fnSuccess, error: fnError});

      // Return this for method chaining.
      return( this );
   }

   // Create a new core remote object. We will need this
   // to create the prototype chain such that the other
   // proxy classes can extend this.
   objRemoteCFC = new RemoteCFC();
   // Create a Javascript proxy for this given CFC.
   function RecallService(){
      this.Name = "RecallCountFunctions";
   }

   // Extend the core CFC Proxy functionality.
   RecallService.prototype = objRemoteCFC;


    RecallService.prototype.getInspected = function( objData, fnSuccess, fnError ){
        this.MakeRemoteCall( "getInspected", objData, fnSuccess, fnError );
    }

    //Define another remote method wrapper. 
    RecallService.prototype.getHeld = function( objData, fnSuccess, fnError ){
        this.MakeRemoteCall( "getHeld", objData, fnSuccess, fnError );
    }

   $(   
      function(){
        var myRecallService = new RecallService();

        $( "select[ name = 'CountChosen' ]" ).change( function(){
           var selectedCount = $( "select[ name = 'CountChosen' ]" );
           var inspected = $("input[name='numInspected']");
           var held = $("input[name='numHeld']");

           if (selectedCount.val() != "0"){
               EnableForm();
               myRecallService.getInspected({store: "#cgi.AUTH_USER#", id: selectedCount}, function
                      ( objResponse ){SetValue("inspected", objResoponse );}, function( objResponse ){
                      alert( objResponse.responseText );});                     
               myRecallService.getHeld({store: "#cgi.AUTH_USER#", id: selectedCount}, function
                      ( objResponse ){SetValue("held", objResponse);}, function( objResponse ){
                      alert( objResponse.responseText);});                      
           }
       });
   }

Извините за длинный пост, я не хотел упускать ничего, что могло бы помочь.Я также не использую Application.cfc или метод onRequest, который, как я слышал, может вызвать проблемы.

Если вам нужно увидеть мой cfc, дайте мне знать, что я тоже могу опубликовать его.

Исправление было:

Change:
   id: selectedCount
To:
   id: selectedCount.val()

Ответы [ 2 ]

1 голос
/ 14 декабря 2010

И кроме вопроса Рэя о том, что Firebug (или Чарльз, или Фиддлер, или другие прокси могут вам сказать), который, безусловно, должен помочь, если это действительно просто ошибка 404, вот некоторые другие мысли, если это не так.

Во-первых, когда вы говорите, что можете получить к нему доступ через браузер, вы имеете в виду http://yourserver/yourcfc.cfc?method=methodname? или что-то еще?И так как вы показываете свою библиотеку ajax, добавляющую returnformat = json, добавляете ли вы это и в URL для тестирования?

Во-вторых, когда вы говорите, что не используете application.cfc или cfm, понимаете ли вы, что этоне только ли один в этом каталоге, но и в родительском, дедушке и так далее?Вы можете быть под влиянием одного из них.Самый простой способ избежать этого (в целях тестирования) состоит в том, чтобы поместить пустой каталог в каталог вызываемой страницы.

В-третьих, если вы загляните в файл application.log (в [cf]\ logs, или через CF Admin), это показывает ошибку, происходящую?Клиент Ajax обычно скрывает это.В самом деле, вы упоминаете о получении 404. Вы уверены, что это ХФУ, который не найден?Что сообщает об этом?

И находится ли CFC в том же каталоге, что и страница CF, которая обслуживала этот HTML / javascript?Поскольку вы называете только файл, кажется, он будет там смотреть.Вы проверяли это с помощью образца URL в браузере?

1 голос
/ 14 декабря 2010

убедитесь, что метод CFC помечен как access = "remote".

Если вы делаете http://servername/path/to/cfc/nameofcfc.cfc?method=methodName&arg1=arg1value (замена значений вашими значениями), это работает? Возьми из него «Аякс»

...