我已经构建了一个WCF Web应用程序,将其方法暴露给get enabled methods
[OperationContract]
[WebGet]
string getStatistics();
[OperationContract]
[WebGet]
string getVenues(string BrandName, int limit);
并编辑了配置文件:
<endpoint address="json" binding="webHttpBinding" contract="foursquare2RDF.IVenue2rdf" behaviorConfiguration="restBehavior"/>
并且在服务行为中:
<endpointBehaviors>
<behavior name="restBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
我在IIS上托管了这个服务,它在浏览器中运行得很好,所以当你点击:
http://localhost:83/venue2rdf.svc/json/getStatistics
它会返回一个好结果
问题是如果显示这些错误,我无法使用此宁静服务:
OPTIONS http://localhost:83/venue2rdf.svc/json/getStatistics?{'venues':'100'} 405 (Method Not Allowed)
XMLHttpRequest cannot load [http://localhost:83/venue2rdf.svc/json/getStatistics][1]. Origin null is not allowed by Access-Control-Allow-Origin.
我正在使用该代码来调用该服务:
$.ajax({
type: "get",
url: statisticsURL,
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (msg) {
eval("var x = " + msg.d);
console.log(x);
}
});
到目前为止我已达到的目标:
答案 0 :(得分:1)
您可能应该提出JSONP请求,因为您跨越了域名,遇到了same origin policy:
$.getJSON(stastatisticsURL + "?callback=?", success: function (msg) {
eval("var x = " + msg.d);
console.log(x);
});
?callback=?
部分告诉jquery使它成为JSONP。我建议你阅读JSONP的内容,因为它不是灵丹妙药。要在WCF服务上启用JSONP,请阅读:
答案 1 :(得分:0)
要使用jQuery使用跨域WCF REST服务,请在下面找到示例:
我的服务如下所示:
[ServiceContract]
public interface IJSONPService
{
[OperationContract]
[WebGet]
string GetDate();
[OperationContract]
[WebInvoke]
string PostData(string name);
}
现在,上述服务的配置条目如下所示:
<services>
<service name="Service.JSONPService">
<endpoint address="" binding="webHttpBinding" behaviorConfiguration="json" bindingConfiguration="defaultRestJsonp" contract="Service.IJSONPService">
</endpoint>
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="json">
<enableWebScript />
</behavior>
</behaviors>
</endpointBehaviors>
<webHttpBinding>
<binding name="defaultRestJsonp" crossDomainScriptAccessEnabled="true">
<readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxDepth="64" maxNameTableCharCount="2147483647" />
<security mode="None" />
</binding>
</webHttpBinding>
您需要注意绑定元素“defaultRestJsonp”中的crossDomainScriptAccessEnabled
属性,该属性负责确定对JSONP的请求,并适当地将响应转换为包含在回调方法中的URL来自URL查询字符串
现在从您的页面开始执行以下调用上述WCF REST服务的JavaScript,如下所示:
function TestingWCFRestWithJsonp() {
$.ajax({
url: "http://domain.com/Service/JSONPService.svc/GetDate",
dataType: "jsonp",
type: "GET",
timeout: 10000,
jsonpCallback: "MyCallback",
success: function (data, textStatus, jqXHR) {
alert(data);
},
error: function (jqXHR, textStatus, errorThrown) {alert('error');
},
complete: function (jqXHR, textStatus) {alert('complete');
}
});
}
function MyCallback(data) {
alert(data);
}
查看$ .ajax方法调用中的jsonpCallback属性。
对Web服务调用的原始请求如下所示:
GET http://localhost/Service/JSONPService.svc/GetDate?callback=MyCallback&_=1343391683779 HTTP/1.1
Host: localhost
Connection: keep-alive
来自WCF REST服务的原始响应如下所示:
HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/x-javascript
Date: Fri, 27 Jul 2012 12:21:23 GMT
Content-Length: 27
MyCallback("27\/07\/2012");
注意:当您执行JSONP请求时,不会调用$ .ajax方法错误/完成/成功。