C# WCF web服务和getJSON为跨域调用返回空数据

C# WCF web服务和getJSON为跨域调用返回空数据,c#,jquery,asp.net-mvc,wcf,rest,C#,Jquery,Asp.net Mvc,Wcf,Rest,我有一个返回JSON格式数据的WCF服务。当我使用Web浏览器时,我可以很容易地看到结果,但当使用Jquery getJSON时,我无法让它工作。我可以在fiddler中看到它正在返回数据,但在firebug中它显示为红色字体和空响应 这是我的WCF服务 [OperationContract] [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyS

我有一个返回JSON格式数据的WCF服务。当我使用Web浏览器时,我可以很容易地看到结果,但当使用Jquery getJSON时,我无法让它工作。我可以在fiddler中看到它正在返回数据,但在firebug中它显示为红色字体和空响应

这是我的WCF服务

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Wrapped,
    UriTemplate = "GetUrl/{iType}")]
String GetUrl(string iType);



    public String GetUrl(string iType)
    {

            return strurl;
        }
我的JSON调用如下所示

    $.getJSON("http://localhost/UrlSvc/UrlService.svc/GetUrl/1",
function (data) {
    console.log("Data JSOn Got");
    $.each(data.items, function (i, item) {
        console.log("Data Received");
    });
});
当我把这个url放到浏览器中时,我得到了如下预期的响应

{"GetChartUrlResult":"ulr_fdba9bc2-7ff7-467f-a6e0-6f4d234169d2.png"}
但getJSOn返回空响应,如Firebug中所示,url本身带有红色字体。
这是一个跨域调用,我已经启用了跨域it WCF

如果调用是跨域的,则必须使用jsonp。您可以将它与
$.getJSON
一起使用,方法是将
回调=?
添加到URL(取决于服务器端API)。确保您的API支持适当地发出回调


此处的文档:

如果调用是跨域的,则必须使用jsonp。您可以将它与
$.getJSON
一起使用,方法是将
回调=?
添加到URL(取决于服务器端API)。确保您的API支持适当地发出回调


此处的文档:

浏览器不允许跨域AJAX调用,并阻止XMLHTTPRequest发生在任何域上,但加载包含脚本或页面的域除外

为了解决这个问题,您可以使用JSONP调用将AJAX响应包装为javascript。将以下查询字符串条目添加到请求中:

callback=?
另外,请注意,如果您使用的是WCF,则需要在服务中启用JSONP。通过将配置文件中的crossDomainScriptAccessEnabled属性设置为true来实现此目的:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>


可以找到关于JSONP和WCF的更多信息。

浏览器不允许跨域AJAX调用,并阻止XMLHTTPRequest发生在任何域上,但加载包含脚本或页面的域除外

为了解决这个问题,您可以使用JSONP调用将AJAX响应包装为javascript。将以下查询字符串条目添加到请求中:

callback=?
另外,请注意,如果您使用的是WCF,则需要在服务中启用JSONP。通过将配置文件中的crossDomainScriptAccessEnabled属性设置为true来实现此目的:

<system.serviceModel>
  <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <standardEndpoints>
    <webScriptEndpoint>
      <standardEndpoint name="" crossDomainScriptAccessEnabled="true"/>
    </webScriptEndpoint>
  </standardEndpoints>
</system.serviceModel>


关于JSONP和WCF的更多信息可以找到。

很抱歉迟到了-你不必使用JSONP,我将WCF与angularjs、jquery、移动应用程序等一起使用-并且永远不要使用JSONP

只需像下面这样装饰您的类和属性,它就会序列化

[DataContract]
public class MyCustomClass
{
   [DataMemember]
   public string Name { get;  set;}
}

抱歉来晚了-你不必使用jsonp,我使用WCF与angularjs、jquery、移动应用程序等一起使用-而且从不使用jsonp

只需像下面这样装饰您的类和属性,它就会序列化

[DataContract]
public class MyCustomClass
{
   [DataMemember]
   public string Name { get;  set;}
}