2011-05-04 104 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