如何配置要通过跨域AJAX调用的WCF服务
我在配置我的WCF服务时遇到一些困难,允许通过跨域AJAX进行消费。
我已成功在客户端上使用此服务没有任何问题,但每次我尝试使用AJAX(通过jQuery中的$ .ajax对象)命中它时,我得到400错误。
这是我的web.config
<!----> <!-- -->
这是我的经营合同。
Namespace Contracts Public Interface IWebAnalyticsService Sub SendWaEvent(ByVal eventID As Integer, ByVal eventValue As String, _ ByVal cookieVisitID As String, ByVal cookieVisitorSession As String, _ ByVal HTTPXForwardedServer As String, ByVal HTTPXRewriteURL As String, _ ByVal ScriptName As String, ByVal ServerName As String) End Interface End Namespace
我的Ajax调用非常简单,但它是:
$.ajax({ type: 'POST', crossDomain: true, url: 'http://localhost:37490/services/webanalyticservice.svc/SendWaEvent', data: Data, //Data is a JSON wrapper I've previously constructed. contentType: 'application/javascript;charset=UTF-8' success: function(result) {DoSomething(result);}, error: HandleError });
[ 更新下面 ]
它总是我们忽略的东西,不是吗? 无论如何,在对上面“直截了当”的AJAX调用非常不屑一顾之后,它最终成了问题。 为了实现这一点,我不得不将我的AJAX调用更改为:
function SendAJAX() { $.ajax({ type: "GET", url: URL, data: Data, dataType: 'jsonp', jsonpCallback: 'MyCallBack', timeout: 10000, crossDomain: true, contentType: 'application/json; charset=UTF-8', success: function (data, textStatus, jqXHR) { WriteSuccess(data, textStatus, jqXHR) }, error: function (jqXHR, textStatus, errorThrown) { WriteError(jqXHR, textStatus, errorThrown) }, complete: function (jqXHR, textStatus) { } }); }
此外,请注意,如果您要在本地进行测试,则需要将以下内容添加到您的Web配置中,否则您将收到500错误,指出在经过身份validation的服务中不允许跨域JavaScript。
您可以使用xdt:transform
在web.release.config中删除此属性。
向@Rajesh大声喊叫! 干得好,伙计!
您的JQuery函数需要如下所示:
function TestingWCFRestWithJsonp() { $.ajax({ url: "http://localhost:37490/services/webanalyticservice.svc/script/SendWaEvent", dataType: "jsonp", type: "GET", timeout: 10000, jsonpCallback: "MyCallback", success: function (data, textStatus, jqXHR) { }, error: function (jqXHR, textStatus, errorThrown) { }, complete: function (jqXHR, textStatus) { } }); } function MyCallback(data) { alert(data); }
由于您的endpoint元素具有地址值集,因此您需要将其附加到.svc的末尾,然后提供方法名称,如下面的示例所示。
绑定元素上的crossDomainScriptAccessEnabled属性标识您的请求是否指定了回调方法,并将响应写回流。
注意:从浏览器中测试URL以查看是否获得了成功的响应,因为它是一个WebGet方法