【问题标题】:Can anyone help me figure out why I cannot access my cfc with an ajax request, but have no problem via browser?谁能帮我弄清楚为什么我无法通过 ajax 请求访问我的 cfc,但通过浏览器没有问题?
【发布时间】:2011-05-24 22:33:56
【问题描述】:

我正在使用 ColdFusion MX7 制作一个简单的表单。我有一对文本输入,我想根据在 cfselect 中选择的内容进行填充。对我的 CFC 的任何 Ajax 调用都会返回 404 错误。如果我从浏览器访问 CFC,则不会出现此类错误。我使用 Ben Nadel 为 cfc 制作自定义 java 代理的示例制作了这个。 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()

【问题讨论】:

  • Firebug 告诉您有关请求的什么信息?
  • 我对这一切有点陌生,我如何看待 firebug?
  • Firebug 显示 IIS 内部服务器错误 (http: 500)
  • 好的,那么请检查您的错误日志 - CF 错误中记录了什么?
  • 哦,伙计! returnformat=json 在 CF7 中不起作用。在 CF7 中,您可以返回 WDDX(默认值),或者如果您使用 returnTYpe=xml,则返回纯字符串。

标签: jquery ajax coldfusion cfc application.cfc


【解决方案1】:

除了 Ray 关于 Firebug(或 Charles、Fiddler 或其他代理可能会告诉你)的问题之外,如果它真的只是 404 错误,这肯定会有所帮助,如果不是,这里还有一些其他想法。

首先,当您说您可以从浏览器访问它时,您的意思是http://yourserver/yourcfc.cfc?method=methodname?或者是其他东西?既然你显示你的 ajax 库添加了 returnformat=json,你是否也在 URL 上添加它来测试?

其次,当您说您没有使用 application.cfc 或 cfm 时,您是否意识到这不仅仅是该目录中是否有一个,而是父级、祖父级等是否有任何?你可能会受到其中之一的影响。避免它的最简单方法(出于测试目的)是将一个空白放入您正在调用的页面的目录中。

第三,如果您查看 application.log 文件(在 [cf]\logs 中,或通过 CF Admin),它是否显示发生错误? Ajax 客户端通常会隐藏它。确实,您提到获得 404。您确定那是未找到的 CFC 吗?这是什么报道?

CFC 是否与提供此 HTML/javascript 的 CF 页面位于同一目录中?由于您只命名文件,因此它似乎会在那里查找。您是否在浏览器中使用示例 URL 进行了测试?

【讨论】:

  • 我现在不在我的工作 vlan 上,所以我无法使用 returnformat=json 进行测试,尽管在 cfc 中也指定了它。我确实使用了您在此处显示的 url 以及沿查询字符串传递的方法和参数。我不相信在我的层次结构中的任何地方都有 application.cfc,但也会在 AM 中测试它。我从我的 Ajax 调用的错误函数中得到错误。我还将检查日志以获取您请求的信息。我感谢所有建议,一旦我有机会跟进它们,我会再次发布。
  • 好吧,这是我的建议结果列表,再次感谢您:-通过 url 在浏览器中调用有效,即使在 URL 中使用 returnFormat=json 也是如此。 - 添加一个空白的 application.cfc 并没有解决这个问题。 -cfc 与提供此脚本的页面位于同一目录中。是的,我是。 - 我正在访问我认为可能是正确的日志,因为 firebug 从 IIS (http 500) 报告了内部服务器错误。
  • 问题在于传递给我的 CFC 的数据。感谢大家的帮助,我应该能够解决这个问题。
【解决方案2】:

确保 CFC 方法标记为 access="remote"。

如果你这样做http://servername/path/to/cfc/nameofcfc.cfc?method=methodName&arg1=arg1value(用你的值替换值)它会起作用吗?去掉“ajax”

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 1970-01-01
    • 2013-11-21
    • 1970-01-01
    相关资源
    最近更新 更多