2011-06-10 212 views
2

似乎我有一個跨域訪問問題。 我見過一些解決方案,指出添加「Access-Control-Allow-Origin:*」,但我不知道我在哪裏可以做到這一點。訪問控制 - 允許來源不允許WCF Web API RESTful

我是否需要創建一些處理程序?

我正在使用WCF Web API。

Error: XMLHttpRequest cannot load http://localhost:8081/Song/0 . Origin http://localhost:8080 is not allowed by Access-Control-Allow-Origin.

編輯

我注意到,當HTTP方法PUT或DELETE這纔會發生。 我可以用GET或POST成功發出請求。

我正在使用jquery進行請求。

$.ajax({ 
     url: Settings.RESTfulEndPointFor('Song/' + songID), 
     type: 'DELETE', 
     success: function (response) { 
      callback(response); 
     } 
    }); 

我不知道爲什麼,但它似乎是這樣導致與Access-Control-Request-Method的方法選項:DELETE。

有沒有人知道是什麼原因造成的?

任何幫助表示讚賞。

回答

1

通常情況下,你把它放在響應標題中。所以把它放在你修改/插入其他標題值這樣的標題中

header('Access-Control-Allow-Origin: *) //change it according to however header is set in wcf , since this is php syntax 

點是你的迴應應該有這個標題。

+0

您好,感謝您的回覆。我在我的問題中添加了更多信息。我無法將此標題添加到我的回覆中。在執行請求的方法之前引發此錯誤。 – aumanets 2011-06-10 16:49:12

0

我創建

AllowCrossDomainRequestHandler : DelegatingChannel 

和每個響應我註冊這個頭:

response.Headers.Add("Access-Control-Allow-Origin", "*"); 
0

我得到這個使用下面的響應頭的工作:

res.writeHead(200, { 
     'Content-Type': 'text/plain', 
     'Access-Control-Allow-Methods': 'DELETE, POST, GET, OPTIONS', 
     'Access-Control-Allow-Origin': '*' 
    }); 
0

首先,對於大多數網頁瀏覽器,無法真正解決跨域限制。大多數甚至不會讓你改變「接受」標題。所以你必須使用JSONP。 JSONP是從跨域服務獲取JSON數據的一種方式,但是它以javascript代碼片段的形式返回 - 這是允許的。它的工作方式是向服務提供回調函數名稱,然後跨域服務返回一個簡單的javascript,並將實際的JSON值作爲參數嵌入到回調函數中。使用WCF WebApi(預覽版6)現在很容易。使用NuGet在VS 2010中安裝它。安裝後,請查看here瞭解更多信息。

1

您使用OPTIONS方法和Access-Control-Request-Method:DELETE標題看到的請求稱爲「預檢請求」。 CORS規範要求使用具有副作用的方法(如DELETE)來確保資源與請求一致。

退房規範的這部分>> http://www.w3.org/TR/cors/#cross-origin-request-with-preflight0

不幸的是,我不知道如何使這種要求的工作與WCF的Web API。

4

連接到通過AJAX一個WCF RESTful服務,當我有這個問題需要

我的JavaScript是這樣的:

var GetData= function(){ 

    var data; 
    $.ajax({ 
     url: this.server + "/data", 
     async: false, 
     type: "GET", 
     success: function (success) { 
      data = success; 
     } 
    }); 
    return data; 

}; 

我的服務端點與此代碼打開

ServiceHost host = new ServiceHost(new MyService()); 
host.Open(); 

所有重要的數據存儲在App.config文件中,我不必爲該修補程序更改該文件。

我知道我必須在發送響應消息之前的某個地方添加標頭。

經過一番搜索和黑客入侵後,我發現了ServiceHost對象的Authorization屬性。 Authorization屬性是ServiceAuthorizationBehavior類的一個實例,其對象具有一個名爲ServiceAuthorizationManager的屬性,該屬性是ServiceAuthorizationManager類的一個實例。

通過創建一個從ServiceAuthorizationManager繼承並將其設置爲ServiceHost實例的授權行爲的ServiceAuthorizationManager屬性的新類,您可以攔截對您的服務的所有調用。

這是怎麼了我已經實現了我的課

public class MyServiceAuthorizationManager : ServiceAuthorizationManager 
{ 
protected override bool CheckAccessCore(OperationContext operationContext) 
{ 

    HttpResponseMessageProperty prop = new HttpResponseMessageProperty(); 
    prop.Headers.Add("Access-Control-Allow-Origin", "*"); 
    operationContext.OutgoingMessageProperties.Add(HttpResponseMessageProperty.Name, prop); 

    return true; 
} 
} 

那麼之後我宣佈我的ServiceHost對象(被打開主機前)我加入這一行

host.Authorization.ServiceAuthorizationManager = new MyServiceAuthorizationManager(); 

這樣做了以後,重建,並運行我的服務錯誤消息停止顯示。萬歲!

最後,我讀了一篇描述ServiceHost類是爲SOAP/WSDL服務而非RESTful服務設計的文章。對於RESTful服務,應該使用WebServiceHost對象。

所以

ServiceHost host = new ServiceHost(new MyService()); 
host.Open(); 

成爲

WebServiceHost host = new WebServiceHost(new MyService()); 
host.Open(); 

您必須添加引用以下組件:

  • System.ServiceModel.Web

希望這可以幫助。

來源:

+0

它爲我工作!非常感謝。但我仍然有 「方法:選項 狀態碼:405方法不允許」 但方法GET無論如何工作..有線!我很高興它的工作! – 2013-07-22 13:46:33

相關問題