0

RESTFUL WCF サービスからデータを取得するために使用する関数があります。返されるデータは JSON でなければなりません。

クライアント側には、以下のような autosuggest と呼ばれる JavaScript 関数があります。

function autosuggest(location){

var uri= 'http://localhost:2043/Suggest.svc/GetAirportsjson?location='+location;
$.ajax({
        url:uri,
        dataType: 'jsonp',
        jsonp: 'callback',
        jsonpCallback: 'jsonpCallback(e)',
        success: function(e){
            alert("success");
        }
    }); };

Service インターフェイスは次のとおりです。

[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Xml, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetAirportsXML?location={location}")]
    [OperationContract]
    List<Suggestions> GetAirportDataXml(string location);

    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "/GetAirportsJSON?location={location}")]
    [OperationContract]
    List<Suggestions> GetAirportDataJson(string location);

そして、場所 = m の Firebug で観察された応答は次のとおりです。

[{"AirportCode":"MMZ","AirportName":"Maimana","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"MZR","AirportName":"Mazar-i-sharif","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"IMZ","AirportName":"Nimroz","AreaCode":"701","CountryCode":"AF","CountryName":"Afghanistan"},{"AirportCode":"TMR","AirportName":"Aguemar","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"BMW","AirportName":"Bordj Badji Mokhtar","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"IAM","AirportName":"In Amenas","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MUW","AirportName":"Mascara-Ghriss","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MZW","AirportName":"Mechria","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"MQV","AirportName":"Mostaganem","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"HME","AirportName":"Oued Irara Apt","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"TMX","AirportName":"Timimoun","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"},{"AirportCode":"TLM","AirportName":"Zenata","AreaCode":"500","CountryCode":"DZ","CountryName":"Algeria"}]

また、サービス コードも提供します。

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.ServiceModel.Activation;

namespace AutosuggestAPI.svc
{
    // NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in code, svc and config file together.
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Suggest : IService1
    {
        public string GetDateTime()
        {
            return DateTime.Now.ToString();
        }


        private static List<Suggestions> GetDistinct(List<Suggestions> suggestions)
        {
            var length = suggestions.Count;
            var Arr = new Suggestions[length];
            suggestions.CopyTo(Arr);

            var dist = new HashSet<string>();

            foreach (var suggestion in Arr)
            {
                if (!dist.Contains(suggestion.AirportCode.ToString()))
                    dist.Add(suggestion.AirportCode.ToString());
                else
                {
                    suggestions.Remove(suggestion);
                }
            }
            return suggestions;
        }

        public List<Suggestions> GetAirportDataXml(string location)
        {
            var suggestions = new List<Suggestions>();
            var val = string.Empty;
            for (int i = 0; i < 2; i++)
            {
                val = i == 0 ? "AirPortName" : "AirPortCode";
                SqlConnection conn = null;
                try
                {
                    // create and open a connection object
                    conn = new SqlConnection("Server=(local);DataBase=DBAirPortCodes;Integrated Security=SSPI");
                    conn.Open();

                    // 1. create a command object identifying
                    // the stored procedure
                    var cmd = new SqlCommand("sp_CheckCondition", conn) { CommandType = CommandType.StoredProcedure };

                    // 2. set the command object so it knows
                    // to execute a stored procedure

                    // 3. add parameter to command, which
                    // will be passed to the stored procedure
                    cmd.Parameters.Add(new SqlParameter("@lookup", val));
                    cmd.Parameters.Add(new SqlParameter("@searchfor", location));
                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var suggestion = new Suggestions()
                        {
                            _airportCode = Convert.ToString(reader["AirPortCode"]).Trim(),
                            _airportName = Convert.ToString(reader["AirPortName"]).Trim(),
                            _areaCode = Convert.ToString(reader["AreaCode"]).Trim(),
                            _countryCode = Convert.ToString(reader["CountryCode"]).Trim(),
                            _countryName = Convert.ToString(reader["CountryName"]).Trim()
                        };
                        suggestions.Add(suggestion);
                    }
                }
                finally
                {
                    if (conn != null)
                        conn.Close();
                }
            }
            var distinctList = GetDistinct(suggestions);
            return distinctList;
        }

        List<Suggestions> GetAirportDataJson(string location)
        {
            List<Suggestions> suggestions = GetAirportDataXml(location);

            return suggestions;
        }


        public List<Suggestions> GetAirportDataJsonp(string location)
        {
            return GetAirportDataXml(location);
        }

        public List<Suggestions> GetAllSuggestions()
        {
            var suggestions = new List<Suggestions>();
            var val = string.Empty;
            for (int i = 0; i < 2; i++)
            {
                val = i == 0 ? "AirPortName" : "AirPortCode";
                SqlConnection conn = null;
                try
                {
                    // create and open a connection object
                    conn = new SqlConnection("Server=(local);DataBase=DBAirPortCodes;Integrated Security=SSPI");
                    conn.Open();

                    var cmd = new SqlCommand("sp_GetAllAirports", conn) { CommandType = CommandType.StoredProcedure };

                    var reader = cmd.ExecuteReader();
                    while (reader.Read())
                    {
                        var suggestion = new Suggestions()
                        {
                            _airportCode = Convert.ToString(reader["AirPortCode"]).Trim(),
                            _airportName = Convert.ToString(reader["AirPortName"]).Trim(),
                            _areaCode = Convert.ToString(reader["AreaCode"]).Trim(),
                            _countryCode = Convert.ToString(reader["CountryCode"]).Trim(),
                            _countryName = Convert.ToString(reader["CountryName"]).Trim()
                        };
                        suggestions.Add(suggestion);
                    }
                }
                finally
                {
                    if (conn != null)
                        conn.Close();
                }
            }
            var distinctList = GetDistinct(suggestions);
            return distinctList;
        }

    }
}

問題は、呼び出しが成功し、ブラウザでデータを取得することですが、Jquery または Javascript でキャッチできないことです。誰か助けてくれませんか?

4

1 に答える 1

0

jsonCallbackに間違った文字列を渡しています。

する必要があります

function autosuggest(location){

    var uri= 'http://localhost:2043/Suggest.svc/GetAirportsjson?location='+location;
    $.ajax({
        url:uri,
        dataType: 'jsonp',
        jsonpCallback: 'jsonpCallback',
        success: function(e){
            alert("success");
        }
    });
 };

また、デフォルトのコールバックパラメータ名をデフォルト値で上書きするのはなぜですか?

編集:jqueryがjsonpのものをどのように処理するかを本当に理解していないようです。

jqueryは、この関数呼び出しにラップされたプレーンテキストとしてjsonを返すjsonpリクエストの戻りを処理する関数を作成します。関数をまったく提供することはできません。これは、jqueryやより厳密な場合に適しています。

次の例を見てください

提供する必要があるパラメーターは、jsonpのデータ型のみです。

var r = $.ajax({
    url : uri
    , dataType:'jsonp'
    , success: function (e) {   
        viewModel.tweets(e.results);                
    }});

編集2:サービスは「callback」パラメーターを処理する必要があり、提供されている場合は、提供された関数呼び出しで応答jsonをラップします

すなわち

リクエスト:http://......../GetAirportsjson?location=....&callback=mycallback

応答:mycallback({ .... you real json response goes here .... })

これを取得するまで、適切なjsonp応答を実行していません

于 2012-04-29T19:57:26.987 に答える