2011-05-04 144 views
0

我是JavaScript新手,我有一个问题让我苦不堪言。WCF javascript调用跨域

我想在页面中放入一个跟踪javascript。该脚本将调用wcf服务来跟踪客户端浏览器信息,页面访问时间和时间戳。问题是我得到:JavaScript调用时出现“405方法不允许”错误。该服务将在另一个域上。现在我在localhost上测试这个。该服务工作正常,因为我可以从浏览器中的新页面调用它。你遇到过同样的问题吗?我怎样才能解决这个问题?

我的JavaScript代码是:

WCF服务代码:

[ServiceContract(Name = "CustomersAssistantService", Namespace = "CustomersAssistantService")] 
public interface ICustomersAssistantService 
{ 
    [OperationContract] 
    [WebGet] 
    string DoWork(); 

    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    string Sum(int n1, int n2); 
} 

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class CustomersAssistantService : ICustomersAssistantService 
{ 
    public string DoWork() 
    { 
     return "work done"; 
    } 

    public string Sum(int n1, int n2) 
    { 
     return (n1 + n2).ToString(); 
    } 
} 

JavaScript调用:

function CallWcf1(){ 
     var _I = this; 
     var url = "http://localhost:58399/CustomersAssistantService.svc/customersAssistantService/";   

      var methodUrl = _I.serviceUrl + 'dowork'; 

      $.ajax({ 
         url: methodUrl, 
         data: '', 
         type: "GET", 
         processData: false, 
         contentType: "application/json", 
         timeout: 10000, 
         dataType: "text", // not "json" we'll parse 
         success: 
         function(res) 
         {          
          if (!callback) return; 
          // *** Use json library so we can fix up MS AJAX dates 
          var result = JSON2.parse(res); 
          // *** Bare message IS result 
          if (bare) 
          { callback(result); return; } 
          // *** Wrapped message contains top level object node 
          // *** strip it off 
          for(var property in result) 
          { 
           callback(result[property]); 
           break; 
          }      
         }, 
         error: 
         function(xhr) 
         { 
          if (!error) return; 
          if (xhr.responseText) 
          { 
           var err = JSON2.parse(xhr.responseText); 
           if (err) 
            error(err); 
           else  
            error({ Message: "Unknown server error." }) 
          } 
          return; 
         } 
        }); 
    } 

难道我做错了什么?

非常感谢,拉杜d

回答

1

您正在碰到the Same Origin Policy。 Ajax请求仅限于与同源;跨域请求通常会被拒绝。

根据您的需求,有多种方法:

  • 如果您的用户将使用仅相当现代浏览器(所以,不是IE7),你可以在服务器上实施Cross Origin Resource Sharing。这是来自W3C的一个标准,它允许服务器开放跨源资源的访问权限,但只有在现代浏览器中才支持。 (在IE上,它受支持,但不支持通常的XMLHttpRequest对象;相反,您必须使用XDomainRequest对象。)
  • 您可以实施JSON-P interface
  • 如果您只想将通知发送到其他域,则可以通过添加具有相关src属性的元素来从中加载资源(imgscript,无论如何);尽管如此,这意味着你仅限于使用GET这个应该用于幂等资源的方法。
+0

你知道Google跟踪代码的工作原理吗?我假设它打电话给一个服务来跟踪信息。 – 2011-05-04 08:24:45

+0

@Radu:我刚刚添加了一些要点,以便你如何处理这个问题。 Google使用第三个('script'元素)。 – 2011-05-04 08:26:05

+0

非常感谢。你救了我的一天:) – 2011-05-04 11:13:36

0

据我所知,请求WCF必须使用POST方法,所以更改为:

type: "POST", 

在AJAX调用。

+0

我也试过后,我有两个测试方法之一是得到,一个是后...但我认为有与跨域调用的问题。 – 2011-05-04 08:19:51