2013-10-11 46 views
5

我寫將由客戶,使他們需要處理跨域請求被用來在野外WCF服務。我在啓用我的開發服務器接受這樣的請求時遇到問題。這裏是場景:配置IIS快遞8啓用CORS

  • 我在Visual Studio 2012的一個實例中運行WCF項目,使用IIS Express 8作爲特定端口上的服務器。
  • 我在使用IIS Express 8作爲服務器的另一個Visual Studio 2012實例中運行客戶端項目。該項目使用AJAX消耗另一個項目中的服務。

當我在IE中運行客戶端項目時沒有問題,因爲IE不會發送預檢選項請求。當我在Chrome中運行它時,預檢選項請求會返回405方法不允許,並且Chrome會放棄該服務。以前的Chrome版本會忽略錯誤並繼續使用實際的POST請求(或Get,無論...),但後續版本似乎更具挑剔性。

我也有部署WCF項目運行到這一點,並通過OPTIONSVerbHandler移動到IIS處理程序映射列表的頂部解決它。

我應該指出的是,我使用的是最慷慨的web.config設置我能想到的,試圖讓CORS。比如我有這樣的WCF項目的配置:

<httpProtocol> 
    <customHeaders> 
    <remove name="X-Powered-By" /> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Headers" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="*" /> 
    <add name="X-Powered-By" value="*" /> 
    </customHeaders> 
</httpProtocol> 

無論如何,任何客戶端跨域請求到WCF項目的代碼運行失敗,405錯誤。

任何幫助建立無論是WCF項目本身或IIS快遞8啓用CORS?

謝謝!

+0

您是否正在爲REST使用WCF服務?你可能實際上想刪除'OptionsVerbHandler'並自己處理。或者,您可能想要公開'JSONP'。我建議你使用'ASP.Net Web-API'。 – Aron

回答

1

答案是使WCF接受CORS預檢消息所需的配置無關與IIS服務器;相反,WCF項目本身需要配置爲使用OPTIONS動詞處理HTTP請求。

長話短說:做這件事真的很難。當談到端點時,WCF是所有交易的一個插座,所以設置它來做一個非常特定的事情(HTTP)是不可取的,儘管它可以完成。真正的解決方案是使用Web API,它是HTTP的主人,可以設置爲非常簡單地執行CORS。

+0

有時候找到答案的關鍵是限制可行答案的範圍。這有幫助。謝謝 –

3
  • 作爲一個值只對Access-Control-Allow-Origin有效。對於其他你需要明確。例如:

接入控制允許方法:GET,PUT,POST和DELETE

或者:

接入控制允許方法:PUT,DELETE

因爲規範說GET和POST是隱含的。

+0

謝謝。可悲的是,改變網絡。config條目爲: 不起作用。 –

12

您可以啓用WCF CORS,它可能是很簡單,一旦你知道如何。

從更一般的問題"cors on IIS" DavidG響應,響應這實在是接近的東西需要一個基本的解決方案闡述:

  • 首先,配置OPTIONSVerbHandler淨處理程序之前執行。

    1. 在IIS控制檯中,選擇「Handler Mappings」。 (在服務器級別或站點級別執行此操作,在站點級別上,它將重新定義您站點的所有處理程序,並在此之後忽略服務器級別所做的任何更改;當然,在服務器級別,如果需要其他站點自己處理選項動詞。)
    2. 在操作窗格中,選擇「查看有序列表...」。尋找OPTIONSVerbHandler,並將其向上移動(大量點擊...)。

    您還可以通過<system.webServer><handlers>下重新定義的所有處理做到這一點在web.config中。 (<clear>然後<add ...>他們回來了,這是什麼呢IIS控制檯給你。對了,沒有必要要求對這個處理程序「讀取」權限。)

  • 二,配置自定義HTTP標頭的CORS需求,如:

    <system.webServer> 
        <httpProtocol> 
        <customHeaders> 
         <add name="Access-Control-Allow-Origin" value="*"/> 
         <add name="Access-Control-Allow-Headers" value="Content-Type"/> 
         <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/> 
        </customHeaders> 
        </httpProtocol> 
    </system.webServer> 
    

    這個例子設置他們對網站/應用/目錄中,是在web.config所有請求的所有響應。如果你想限制他們到一些網址,把它放在<location>標籤。
    您也可以在IIS控制檯中添加這些自定義標頭。

這是一個基本的解決方案,因爲它會發出CORS頭甚至要求不需要它,也許打開你的應用程序意外的用途。但對於WCF,它看起來是最簡單的一個。使用MVC或webapi,我們可以改爲使用代碼(「手動」或使用最新版本的webapi中提供的內置支持)處理OPTIONS動詞和cors頭。

+0

我有同樣的問題,我按照上面的步驟。但它沒有產生預期的結果。請求的標題和響應中允許的標題匹配單詞,但仍然失敗。請幫助 –

+0

@SivaSenthil,如果您的情況對OPTIONS請求的響應狀態爲200,則可能不再是IIS/WCF的麻煩。 –

+0

@Fredric,不幸的是,OPTIONS請求失敗,出現400-錯誤的請求狀態。 –

0

我只是想提一下,在撰寫本文時,我不相信網頁瀏覽器支持Access-Control-Allow-MethodsAccess-Control-Allow-Headers的*通配符值,即使它在規範中。

規格:

https://www.w3.org/TR/cors/
https://tools.ietf.org/html/rfc2616#section-4.2

見兼容問題(更容易閱讀):

https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Methods https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Allow-Headers

代替以上,更好的解決方案,這意味着你必須明確 pro提供您想要允許的每個標題或方法。