ColdFusion конвертирует ASP.Net Webservice: хотите JSON, но получите WDDX - PullRequest
0 голосов
/ 24 декабря 2010

Я использую cfc для преобразования данных веб-службы ASP.NET в объект запроса coldfusion. Я возвращаю этот объект запроса с помощью вызова getJSON в моем коде jquery. Но возвращенные данные форматируются как пакет wddx, а не как набор данных JSON, и код, похоже, не завершается. Не уверен, что я делаю не так.

$(document).ready(function(){
    $("#submitForm").click(function(e){ 
        e.preventDefault();
        e.stopPropagation();
        internetUsage();
    });     
});

function internetUsage(){       
    $.getJSON("system.cfc",{
        method:'getInternetUsage',
        SessionID:$("#vSessionID").val(),
        CustomerCode:$("#vCustomerCode").val(),
        FullUserName:$("#selUser").val(),
        StartDate:$("#vStartDate").val(),
        EndDate:$("#vEndDate").val(),
        returnformat:'json',
        queryformat:'column'},function(res,code){

        alert('hello'); // THIS ALERT NEVER FIRES
    });
}

Я могу подтвердить, что это IS добросовестный правильно сформированный объект запроса, возвращенный функцией getInternetUsage () (ниже) Я в недоумении относительно того, почему он приходит как пакет WDDX.

<cffunction name="getInternetUsage" access="remote" returnType="any" returnformat="JSON" output="false">
        <cfargument name="SessionID" required="true">
        <cfargument name="CustomerCode" required="true">
        <cfargument name="FullUserName" required="true">
        <cfargument name="StartDate" required="true">
        <cfargument name="EndDate" required="true">
        <cfargument name="entity" required="false" default="Table">
        <cfset var qResult = 0>
        <cfset var strWS = invokeInternetUsage(
                        SessionID=arguments.SessionID,
                        CustomerCode=arguments.CustomerCode,
                        FullUserName=arguments.FullUserName,
                        StartDate=arguments.StartDate,
                        EndDate=arguments.EndDate)>
        <cfset var aResult = convertDotNetDataset(strWS)>

        <--- extract the queries from the returned struct ---> 
        <cfif arguments.entity is 'Table'>
            <cfset qResult = aResult.Table>
        <cfelseif arguments.entity is 'Table1'>
            <cfset qResult = aResult.Table1>
        </cfif>
        <cfreturn qResult>
    </cffunction>

    <cffunction name="invokeInternetUsage" access="remote" returnType="any" output="false">
        <cfargument name="SessionID" required="true">
        <cfargument name="CustomerCode" required="true">
        <cfargument name="FullUserName" required="true">
        <cfargument name="StartDate" required="true">
        <cfargument name="EndDate" required="true">
        <cfset var aTemp = "">
        <cfinvoke 
            webservice="http://Portal/internet.asmx?WSDL"
            method="Usage"
            returnvariable="aTemp">
                <cfinvokeargument name="SessionID" value="#arguments.SessionID#"/>
                <cfinvokeargument name="CustomerCode" value="#arguments.CustomerCode#"/>
                <cfinvokeargument name="FullUserName" value="#arguments.FullUserName#"/>
                <cfinvokeargument name="StartDate" value="#arguments.StartDate#"/>
                <cfinvokeargument name="EndDate" value="#arguments.EndDate#"/>
        </cfinvoke>
        <cfreturn aTemp>
    </cffunction>


    <!--- convertDotNetDataset --->
    <!--- Converts a dotnet dataset into a structure of queries --->
    <cffunction name="convertDotNetDataset" access="remote" returnType="any" output="false"
            hint="takes a .Net dataset and converts it to a CF structure of queries">
    <cfargument name="dataset" required="true">
    <cfset var Local = StructNew()>
    <cfset Local.result = structNew() />
    <cfset Local.aDataset = arguments.dataset.get_any() />
    <cfset Local.xSchema = xmlParse(Local.aDataset[1]) />
    <cfset Local.xData = xmlParse(Local.aDataset[2]) />

    <!--- Create Queries --->
    <cfset Local.xTables = Local.xSchema["xs:schema"]["xs:element"]["xs:complexType"]["xs:choice"] />
    <cfloop from="1" to="#arrayLen(Local.xTables.xmlChildren)#" index="Local.i">
        <cfset Local.tableName = Local.xTables.xmlChildren[Local.i].xmlAttributes.name />
        <cfset Local.xColumns = Local.xTables.xmlChildren[Local.i].xmlChildren[1].xmlChildren[1].xmlChildren/>
        <cfset Local.result[Local.tableName] = queryNew("") />
        <cfloop from="1" to="#arrayLen(Local.xColumns)#" index="Local.j">
            <cfif left(Local.xColumns[Local.j].xmlAttributes.name,6) neq 'Column'>
                <cfset queryAddColumn(Local.result[Local.tableName], Local.xColumns[Local.j].xmlAttributes.name, arrayNew(1)) />
            </cfif>
        </cfloop>
    </cfloop>

    <!--- see if there are any row of data, if not exit --->
    <cfif NOT StructKeyExists(Local.xData["diffgr:diffgram"], "NewDataSet")>
        <cfreturn Local.result>
    </cfif>

    <!--- Populate Queries --->
    <cfset Local.xRows = Local.xData["diffgr:diffgram"]["NewDataSet"] />
    <cfloop from="1" to="#arrayLen(Local.xRows.xmlChildren)#" index="Local.i">
        <cfset Local.thisRow = Local.xRows.xmlChildren[Local.i] />
        <cfset Local.tableName = Local.thisRow.xmlName />
        <cfset queryAddRow(Local.result[Local.tableName], 1) />
        <cfloop from="1" to="#arrayLen(Local.thisRow.xmlChildren)#" index="Local.j">
            <cfif left(Local.thisRow.xmlChildren[Local.j].xmlName,6) neq 'Column'>
                <cfset querySetCell(Local.result[Local.tableName], Local.thisRow.xmlChildren[Local.j].xmlName, Local.thisRow.xmlChildren[Local.j].xmlText, Local.result[Local.tableName].recordCount) />
            </cfif>
        </cfloop>
    </cfloop>

    <cfreturn Local.result>
</cffunction>

РЕДАКТИРОВАТЬ - ХФУ

<cffunction name="invokeInternetUsage" access="remote" returnType="any" output="false">
    <cfargument name="SessionID" required="true">
    <cfargument name="CustomerCode" required="true">
    <cfargument name="FullUserName" required="true">
    <cfargument name="StartDate" required="true">
    <cfargument name="EndDate" required="true">
    <cfset var aTemp = "">
    <cftry>
        <cfinvoke 
            webservice="http://Portal/internet.asmx?WSDL"
            method="Usage"
            returnvariable="aTemp">
                <cfinvokeargument name="SessionID" value="#arguments.SessionID#"/>
                <cfinvokeargument name="CustomerCode" value="#arguments.CustomerCode#"/>
                <cfinvokeargument name="FullUserName" value="#arguments.FullUserName#"/>
                <cfinvokeargument name="StartDate" value="#arguments.StartDate#"/>
                <cfinvokeargument name="EndDate" value="#arguments.EndDate#"/>
        </cfinvoke>
        <cfcatch></cfcatch>
    </cftry>
    <cfreturn aTemp>
</cffunction>


<!--- convertDotNetDataset --->
<cffunction name="convertDotNetDataset" access="remote" returnType="any" output="false"
        hint="takes a .Net dataset and converts it to a CF structure of queries">
<cfargument name="dataset" required="true">
<cfset var Local = StructNew()>
<cfset Local.result = structNew() />
<cfset Local.aDataset = arguments.dataset.get_any() />
<cfset Local.xSchema = xmlParse(Local.aDataset[1]) />
<cfset Local.xData = xmlParse(Local.aDataset[2]) />

<!--- Create Queries --->
<cfset Local.xTables = Local.xSchema["xs:schema"]["xs:element"]["xs:complexType"]["xs:choice"] />
<cfloop from="1" to="#arrayLen(Local.xTables.xmlChildren)#" index="Local.i">
    <cfset Local.tableName = Local.xTables.xmlChildren[Local.i].xmlAttributes.name />
    <cfset Local.xColumns = Local.xTables.xmlChildren[Local.i].xmlChildren[1].xmlChildren[1].xmlChildren/>
    <cfset Local.result[Local.tableName] = queryNew("") />
    <cfloop from="1" to="#arrayLen(Local.xColumns)#" index="Local.j">
        <cfif left(Local.xColumns[Local.j].xmlAttributes.name,6) neq 'Column'>
            <cfset queryAddColumn(Local.result[Local.tableName], Local.xColumns[Local.j].xmlAttributes.name, arrayNew(1)) />
        </cfif>
    </cfloop>
</cfloop>

<!--- see if there are any row of data, if not exit --->
<cfif NOT StructKeyExists(Local.xData["diffgr:diffgram"], "NewDataSet")>
    <cfreturn Local.result>
</cfif>

<!--- Populate Queries --->
<cfset Local.xRows = Local.xData["diffgr:diffgram"]["NewDataSet"] />
<cfloop from="1" to="#arrayLen(Local.xRows.xmlChildren)#" index="Local.i">
    <cftry>
<cfset Local.thisRow = Local.xRows.xmlChildren[Local.i] />
        <cfset Local.tableName = Local.thisRow.xmlName />
        <cfset queryAddRow(Local.result[Local.tableName], 1) />
        <cfloop from="1" to="#arrayLen(Local.thisRow.xmlChildren)#" index="Local.j">
            <cfif left(Local.thisRow.xmlChildren[Local.j].xmlName,6) neq 'Column'>
                <cfset querySetCell(Local.result[Local.tableName], Local.thisRow.xmlChildren[Local.j].xmlName, Local.thisRow.xmlChildren[Local.j].xmlText, Local.result[Local.tableName].recordCount) />
            </cfif>
        </cfloop>
        <cfcatch></cfcatch>
    </cftry>
</cfloop>

<cfreturn Local.result>

Ответы [ 3 ]

3 голосов
/ 24 декабря 2010

Какая версия Coldfusion работает на вашем сервере? Я знаю, CFMX7 и старше не поддерживают возвращение JSON из CFC. По моему опыту, когда CF встречает неизвестный формат возврата, он использует значение по умолчанию (wddx).

0 голосов
/ 30 ноября 2012

Вы должны сообщить нам, какую версию ACF или Railo вы используете. В ACF8 есть ошибка, из-за которой вам нужно удалить метод onrequest () в application.cfc при вызове удаленных функций:

http://www.raymondcamden.com/index.cfm/2009/7/13/ColdFusion-9-fixes-onRequest-adds-onCFCRequest

Кроме того, вы должны запустить инструменты разработчика в Chrome и проверить ответ, который вы получаете на ваш запрос ajax.

0 голосов
/ 27 декабря 2010

Это для CF8 и CF9: в CFFUNCTION вы можете указать: returnFormat = "json"

Кроме того, при любом вызове CFC вы сможете добавить переменную URL: & return_format = json

и вернись JSON

...