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 でキャッチできないことです。誰か助けてくれませんか?