使用Jquery Mobile消耗WCF服务正在返回400错误请求

时间:2012-11-13 23:46:37

标签: .net ajax wcf jquery

我已经搜索了这个,但是我找不到能帮助我的东西,所以如果发布这个帖子我就会道歉并且我一直无法找到它。

我已经创建了一个托管在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");
            }
        });
         });

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

3 个答案:

答案 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)

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

  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();
     }
    
  3. 我发现的关键点是将参数传递给webGet方法

    data: {id : "gb"}