2015-09-11 7 views
11

我試圖找出它是什麼,我在我的方法,這是防止我的WCF服務被訪問。如果我嘗試通過來自同一個域的AJAX請求訪問服務,則沒有問題。jQuery與ASP.NET的AJAX CORS WCF服務不工作,儘管web.config條目

我已將我在網站上其他地方看到的建議添加到web.config中的<httpProtocol>標記中,以啓用CORS,但似乎並不奏效(請注意前幾個元素在customHeaders是有不同的安全原因):

<location path="FooBar.svc"> 
    <system.webServer> 
     <httpProtocol> 
     <customHeaders> 
      <add name="Access-Control-Request-Method" value="POST"/> 
      <add name="Access-Control-Allow-Origin" value="*" /> 
      <add name="Access-Control-Allow-Headers" value="Content-Type, X-Requested-With, X-Custom-Header" /> 
     </customHeaders> 
     </httpProtocol> 
    </system.webServer> 
    </location> 

儘管在地方這之中,我還得到一個錯誤時,試圖從一個單獨的頁面調用服務(使用IE開發者工具):「對XMLHttpRequest的.. 。需要跨源資源共享(CORS)「

我的jQuery ajax調用(Post)的值設置爲與CORS一起使用:

crossDomain: true, 
xhrFields: { withCredentials: true }, 

我甚至嘗試添加潛在IE XDR問題一個解決方法,https://github.com/jaubourg/ajaxHooks/blob/master/src/xdr.js,有沒有效果(我使用IE11,所以我不希望它)

任何人有任何想法至於這裏可能會出現什麼問題?

(編輯:服務本身設置爲與這些屬性,如果有差別:

[OperationContract] 
[WebInvoke(Method = "POST", 
     BodyStyle = WebMessageBodyStyle.WrappedRequest, 
     ResponseFormat = WebMessageFormat.Json)] 

(編輯2:如果它是有意義的,該服務必須是部分的所有HTTPS站點使用表單身份驗證 - 並且該服務需要使用與站點相同的登錄憑據。)

+2

您是否嘗試過使用類似郵遞員的服務調用服務?您能否在http響應頭文件中看到Access-Control-Allow-Origin? –

+0

不幸的是,我不能在我的工作機器上安裝任何東西,所以我必須等待拜占庭式的過程,請求它通過,然後才能獲得任何有用的工具(並且該服務不可用外面呢)。我希望能夠在這方面取得突破。 – notnot

+0

後端服務器PLZ? – Akki619

回答

4

您是否在jquery中使用$ .support.cors = true進行了嘗試。

+0

對不起,這不會改變任何事情,至少在它自己。 – notnot

5

您的<customHeaders> web.config部分針對沒有憑據的CORS請求進行設置。你需要一個不同的配置,以允許CORS請求與憑據:

  1. 設置附加Access-Control-Allow-Credentialstrue

  2. Access-Control-Allow-Origin標題不能設置爲*。您必須返回CORS請求原點/主機的區分大小寫的匹配項。

來源7.2 Resource Sharing Check (W3C Recommendation for Cross-Origin Resource Sharing)

+0

行爲仍然沒有變化 – notnot

7

啓用CORS爲true在後端服務器,其中服務託管應該理想地解決問題。然而,還有一種方法......你可以在jQuery代碼和WCF服務之間有一個包裝器(注:當你沒有權限修改例如htaccess時,這是你必須在團隊中建議的方法之一文件在Apache中,我們設置CORS訪問其他域訪問我們的服務)。所以這個方法就像這樣....

jQuery Code -> Wrapper (Webmethod in .NET) -> WCF service

jQuery代碼和包裝器駐留在相同的域。 jQuery調用webmethod,它依次觸發相應的WCF服務方法來獲取數據。這種方法的失敗是請求遍歷一層,這是我在開始時提到Note的原因。

+0

除了web.config中的條目以外,是否還有其他內容能夠啓用CORS?我必須改變IIS本身內的東西嗎? – notnot

+0

查看ViajyP所說的SSL。只是挑剔我遇到了類似於woff文件的不同問題,我會建議發佈ssl更改重新啓動整個IIS。 – Akki619

5

如果您的服務是HTTPS,如果你使用的是自簽名SSL證書,然後跨域儘管爲Access-Control-Allow-Origin頭做web.config設置呼叫將失敗。您應該嘗試將有效的SSL證書導入到您的IIS中,並查看您獲得的信息。

+0

這是爲什麼? – notnot

+2

這就是瀏覽器的行爲。這是爲了避免跨站點腳本(XXS)漏洞。爲了測試的目的來克服這一點;您可以嘗試以下步驟:1)在瀏覽器的第一個選項卡中打開具有Ajax請求的跨域頁面。 2)在標籤2中打開包含WCF服務器的網站的任何HTTPS頁面。3)由於您有自簽名的SSL;你應該獲得證書警告和「我瞭解風險...繼續」的消息與鏈接。 4)點擊繼續鏈接5)現在再次來到標籤1有其他域的頁面6)刷新它,你的Ajax到WCF應該工作。在Prod上,您將擁有有效的SSL。 – vijayP

-1

曾試圖Response在頭部添加Access-Control-Allow-Origin如下(僅當你希望你的WCF服務是來自任何域的訪問),

在我的Web API方法之一,我用UrlReferrer這一點。 代碼看起來像下面

Uri referredURL = HttpContext.Current.Request.UrlReferrer; 
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "http://" + referredURL.Host); 

但這種方法是有點風險的,因爲它不能保證是否會得到UrlReferrer與否因爲它依賴於客戶端(瀏覽器)上。

4

使用WCF,您需要做的不僅僅是在web.config中添加自定義標頭。只需編輯web.config就足夠用於ASP.NET Web API,但如果這不是您正在處理的內容,則需要添加自定義代碼以允許在您的Web服務中使用OPTIONS標頭。基本上,您需要創建一個消息檢查器,然後使用消息檢查器類來添加所需的頭文件。

有關代碼和示例服務,請參閱the WCF page on enable-cors.org

+0

在賞金用完之前,現在還沒有機會測試它,但這看起來像是朝着正確的方向發展。 – notnot

+1

您可能還想查看[此博客文章](http://blogs.microsoft.co.il/idof/2011/07/02/cross-origin-resource-sharing-cors-and-wcf/)因爲它包含一個可以節省執行時間的服務主機工廠。與使用其他後端的CORS相比,這是一個非常頭疼的問題,但它可能是100%。 –

相關問題