来自ajax的WCF服务调用(跨域)

时间:2013-06-19 05:36:53

标签: javascript ajax wcf

我正在尝试使用本地地址从其他项目调用WCF服务。我在同一解决方案资源管理器中有两个项目。一个项目有服务,另一个是Web应用程序,我在javascript中使用Ajax来调用WCF服务。 以下是我的javascript代码,

function sclick() {
    alert("m here");
    $.ajax({
        type: "POST",
        url: "http://localhost:4780/Service1.svc/myfunction",
        contentType: "application/json; charset=utf-8 ",
        dataType: "json",
        success: success,
        error: fail
    })

}

function success(result) {
    alert(result);
   //alert("Success" + result.myfunctionResult);
}

function fail(result) {
    alert("Fail..... " + result.statusText + ": " + result.status);
}

流程转到成功函数,但我在结果对象中得到null。 ajax部分中的URL是通过在浏览器中查看service1.svc文件获得的URL。 谁能告诉我哪里出错了! 它在同一个项目中工作正常。但跨域不起作用。当我从其他项目调用该服务时,它返回null。我在服务中给出了突破点。断点显示正确的值,但它不会出现在我的javascript代码中。

3 个答案:

答案 0 :(得分:0)

您不应该通过regaular Web服务调用与开箱即用的WCF服务交谈,这可能更复杂。见:http://social.msdn.microsoft.com/Forums/vstudio/en-US/c896b564-7a9b-423d-a42d-d36c33c46e7d/consume-a-wcf-service-as-a-url

这是因为WCF具有框架使用的数据的“开销”。另外,WCF配置可能有所不同:它可能是REST,SOAP甚至是Tcp或命名管道。

更简单的方法是生成WCF客户端: http://msdn.microsoft.com/en-us/library/ms733133.aspx

而不是 从ajax调用客户端代理,而不是尝试直接调用服务器。

假设您正在运行.Net Web应用程序。 否则,请参阅如何直接与服务对话。这是一个关于如何使用Java执行此操作的示例: http://hoonzis.blogspot.co.il/2011/07/consuming-wcf-services-with-java-client.html

最后,这里建议并稍后删除的另一个好答案是将WCF服务配置为支持REST API,如下所示: http://www.codeproject.com/Articles/128478/Consuming-WCF-REST-Services-Using-jQuery-AJAX-Call

答案 1 :(得分:0)

我认为您的问题可能是WCF不支持开箱即用的跨域,除非您启用CORS。

这里有一个很好的阅读解释和解决方法:http://blogs.msdn.com/b/carlosfigueira/archive/2012/05/15/implementing-cors-support-in-wcf.aspx

另一种可能更容易的替代方法是将WebAPI放到您正在使用的任何项目中,可以很容易地在WebForms或MVC中执行此操作。

答案 2 :(得分:0)

不了解WCF Web服务,但可能是这些代码行,用于常规服务,解决您的问题

          var jsonData = [YOUR JSON PARAMETER];

            $.ajax({
                async: false,
                type: "POST",
                url: [YOUR WEB SERVICE URL],
                contentType: "application/json; charset=utf-8",                  
                data: JSON.stringify({ json: jsonData }),
                dataType: "json",                
                success: OnSuccess,
                failure: function(err) {
                    alert("Error : " + err.d);
                }  
            }); 

            function OnSuccess(data) {
                alert("Success:" + data.d);                       
            }

你可以做一件事,只需要设置Access-Control-Allow-Origin& CustomeHeaders中的Access-Control-Allow-Header是您的Web服务web.config文件。

 <add name="Access-Control-Allow-Origin" value="*" />
 <add name="Access-Control-Allow-Headers" value="Content-Type" />

如果您只想允许特定域,则可以使用域的特定值而不是*值

来实现