我已经搜索了这个,但是我找不到能帮助我的东西,所以如果发布这个帖子我就会道歉并且我一直无法找到它。
我已经创建了一个托管在IIS中的WCF服务应用程序。目前它的基本只有一个hello world方法,基本上将一个国家名称及其代码作为json对象返回。
我还编写了一些jquery,它将远程调用该方法,目的是填充列表对象。
目前,当我调用该方法时,它会触及ajax调用的成功参数,并以“未定义”警告我,我不知道是什么引起了这种情况,但最有可能的是我犯了一个愚蠢的错误。
继承服务和jquery的代码
网络配置:
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
<authentication mode="None" />
</system.web>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webScriptEndpoint>
<standardEndpoint crossDomainScriptAccessEnabled="true"/>
</webScriptEndpoint>
</standardEndpoints>
</system.serviceModel>
</configuration>
service1.svc
<%@ ServiceHost Language="C#" Debug="true" Service="RestfulFlightWCF.Service1" codeBehind="Service1.svc.cs" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory" %>
service1.svc.cs { //注意:您可以使用“重构”菜单上的“重命名”命令在代码,svc和配置文件中一起更改类名“Service1”。
[ServiceContract(Namespace = "JsonpAjaxService")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1
{
[WebGet(ResponseFormat = WebMessageFormat.Json)]
public Country GetCountry(string id)
{
Country county = new Country();
county.Name = "United Kingdom";
county.Id = "gb";
return county;
}
[DataContract]
public class Country
{
[DataMember]
public string Id { get; set; }
[DataMember]
public string Name { get; set; }
}
}
jquery的
$(document).ready(
function () {
$.ajax({
type:"GET",
Data:'gb',
Url:"http://192.168.1.6:80/FlightServices.svc/GetCountry",
DataType:"jsonp",
method:"GetCountry",
success: function(msg){
debugger;
alert(msg.responseText);
if (msg.responseText) {
var err = msg.responseText;
if (err)
error(err);
else
error({ Message: "Unknown server error." })
}
},
failure: function(){
alert("something went wrong");
},
error: function(){
alert("something happned");
}
});
});
很抱歉这篇长篇文章,但我认为如果我加入我的代码会有所帮助。
答案 0 :(得分:0)
一小部分必须如何发送回来
public string GetCountry(string id)
{
string json = string.Empty;
Country county = new Country();
county.Name = "United Kingdom";
county.Id = "gb";
json = "{ \"name\" : \"" + county.Name + "\", \"id\" : \"" + county.Id + "\" }"
return json;
}
硬编码是一种不好的做法。最好将数据序列化。
答案 1 :(得分:0)
您可能会错过xml配置中的某些配置,包括:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<system.serviceModel>
我自己并没有真正使用WCF,而是贯穿本教程,它应该涵盖了什么缺失: http://www.codeproject.com/Articles/417629/Support-for-JSONP-in-WCF-REST-services
答案 2 :(得分:0)
好的所以我在摆弄了一段时间之后今晚得到了这个工作,所以我想我会在寻找修复时发现一些我发现的东西。
将响应格式添加到WebGet上的被调用方法。
[WebGet(ResponseFormat= WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
将我的jQuery更改为以下内容:
var Type;
var Url;
var Data;
var ContentType;
var DataType;
var ProcessData;
var method;
//Generic function to call WCF Service
function CallService() {
$.ajax({
type: Type, //GET or POST or PUT or DELETE verb
url: Url, // Location of the service
data: Data, //Data sent to server
contentType: ContentType, // content type sent to server
dataType: DataType, //Expected data format from server
processdata: ProcessData, //True or False
success: function (msg) {//On Successful service call
ServiceSucceeded(msg);
},
error: ServiceFailed// When Service call fails
});
}
function ServiceFailed(xhr) {
alert(xhr.responseText);
if (xhr.responseText) {
var err = xhr.responseText;
if (err)
error(err);
else
error({ Message: "Unknown server error." })
}
return;
}
function ServiceSucceeded(result) {
if (DataType == "jsonp") {
debugger;
resultObject = result.GetEmployeeResult;
var string = result.Name + " \n " + result.Id ;
alert(string);
}
}
function GetCountry() {
Data = {id : "us"};
Type = "GET";
Url = "http://192.168.1.6:80/FlightService.svc/GetCountry";
DataType = "jsonp";
ContentType = "application/json; charset=utf-8";
ProcessData = false;
method = "GetCountry";
CallService();
}
$(document).ready(
function () {
GetCountry();
}
我发现的关键点是将参数传递给webGet方法
data: {id : "gb"}