2

我已经搜索过这个,但我找不到对我有帮助的东西,所以我很抱歉,如果这个已经发布并且我只是找不到它。

我创建了一个托管在 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>

服务1.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");
            }
        });
         });

很抱歉这篇文章很长,但我认为如果我包含我的代码会有所帮助。

4

3 回答 3

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;
    }​

硬编码是一种不好的做法。最好序列化数据。

于 2012-11-13T23:58:16.103 回答
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

于 2012-11-14T14:43:27.160 回答
0

好的,所以在摆弄了一段时间后,我今晚得到了这个工作,所以我想我会发布一些我在寻找修复程序时发现的东西。

  1. 在被调用的方法上以响应格式添加到 WebGet。

    [WebGet(ResponseFormat= WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)]
    
  2. 将我的 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"}
于 2012-11-14T23:36:45.430 回答