【问题标题】:WCF Service call from ajax(cross domain)来自 ajax 的 WCF 服务调用(跨域)
【发布时间】:2013-06-19 05:36:52
【问题描述】:

我正在尝试使用本地地址从其他项目调用 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 代码中。

【问题讨论】:

  • 你是否配置你的 WCF 服务也接受跨域请求?
  • 我想是的。在 app.config 文件中,我给出了以下标签 我说的对吗?还是我需要做其他事情?
  • 您的服务是否配置为支持 REST API?

标签: javascript ajax wcf


【解决方案1】:

您不应该通过常规的 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

【讨论】:

    【解决方案2】:

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

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

    另一种可能对您来说更容易的选择是将 WebAPI 放入您正在使用的任何项目中,可以很容易地在 WebForms 或 MVC 中做到这一点。

    【讨论】:

      【解决方案3】:

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

                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);                       
                  }
      

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

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

      如果您只想允许特定域,您可以使用域的特定值而不是 * 值来做到这一点

      【讨论】:

        猜你喜欢
        • 2011-10-05
        • 2012-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-22
        • 1970-01-01
        • 2012-04-23
        • 2012-06-11
        相关资源
        最近更新 更多