2016-02-25 58 views
11

我正在嘗試向Webforms樣式的Web應用程序(.aspx和.asmx)添加一些[WebMethod]帶註釋的端點函數。asp.net Webforms上的CORS端點[WebMethod]端點

我想用[EnableCors]註釋這些端點,從而獲得所有良好的ajax預檢功能。

VS2013接受註釋,但仍然不符合CORS的要求。 (當它們使用相同原點但不是交叉原點時,它們工作正常)。

我甚至不能讓他們發揮跨原點與降濁

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "*"); 

方法 - 我的瀏覽器拒絕迴應,而跨域響應頭不會出現。

如何在這些[WebMethod]端點中獲得CORS功能?

+0

WebForms積極地使修改標題變得困難,例如,只要有東西發送給用戶,您就無法更改標題。以下是我之前使用過的一種黑客技術:http://stackoverflow.com/questions/4091157/httpmodule-to-add-headers-to-request – MatthewMartin

+0

另一種使用webconfig的方法http://stackoverflow.com/questions/2922178/is-it-it-it-it-add-response-http-headers-in-web-config – MatthewMartin

+0

另一種更現代的使用owin中間件來操縱標題的方法:http://www.mikesdotnetting.com/article/269/asp-net-5-middleware-or-where-has-my-httpmodule-gone – MatthewMartin

回答

0

我認爲你的代碼看起來不錯,但是IIS不會單獨發送頭部實體和預期的響應。請檢查IIS是否配置正確。

如果CORS不適合您的特殊性問題的工作,也許JSONP是另一種可能的方式。

+0

也許json是另一種可能的方式。怎麼樣? – Coding4Fun

+1

我想你錯讀了'JSONP'作爲'JSON'。 JSONP響應是包裝在函數調用中的標準JSON字符串。每個現代瀏覽器都能夠評估JSONP響應,而不受原始域名策略限制。你可以找到一些解決方案的C#像這樣http://stackoverflow.com/questions/14221429/how-can-i-produce-jsonp-from-an-asp-net-web-service-for-cross-domain-calls – stanleyxu2005

7

我建議您已執行此頁面上的所有步驟,仔細檢查:CORS on ASP.NET

除了:

Response.AppendHeader("Access-Control-Allow-Origin", "*"); 

相關搜索:

Response.AppendHeader("Access-Control-Allow-Methods","*"); 

/嘗試直接加入網頁配置:

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Methods" values="*" /> 
     <add name="Access-Control-Allow-Headers" values="Content-Type" /> 
    </customHeaders> 
    <httpProtocol> 

如果失敗,則需要確保您可以控制這兩個域。

3

如果您需要預檢請求,例如所以你可以發送認證請求,你無法設置Access-Control-Allow-Origin: *。它必須是特定的Origin域。
如果您使用除默認值以外的任何內容,還必須設置Access-Control-Allow-MethodsAccess-Control-Allow-Headers響應標頭。 (注意這些限制只是CORS本身的工作原理 - 這就是它的定義。)

所以,這是不夠的,只是扔在[EnableCors]屬性,必須將值設置爲參數:

[EnableCors(origins: "https://www.olliejones.com", headers: "X-Custom-Header", methods: "PUT", SupportsCredentials = true)] 

或者,如果你想手動和明確的做的事情:

HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Origin", "https://www.olliejones.com"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Headers", "X-Custom-Header"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Methods", "PUT"); 
HttpContext.Current.Response.AppendHeader("Access-Control-Allow-Credentials", "true"); 

最後一件事 - 開始時您必須致電.EnableCors()。在例如MVC或WebAPI,你可以在HttpConfiguration上調用它,當註冊配置等 - 但我不知道它如何與WebForms一起工作。

0

如果您使用AppendHeader方法發送緩存專用標頭並同時使用緩存對象模型(緩存)來設置緩存策略,則緩存對象模型爲用過的。這種行爲使ASP.NET能夠保持最嚴格的設置。例如,請考慮包含用戶控件的頁面。如果這些控件具有衝突緩存策略,則將使用最嚴格的緩存策略。如果一個用戶控件設置標題「Cache-Control:Public」,而另一個用戶控件通過調用SetCacheability設置限制性更高的標題「Cache-Control:Private」,則「Cache-Control:Private」標題將與響應。

您可以在web配置中爲customHeaders創建一個httpProtocol。

<httpProtocol> 
    <customHeaders> 
     <add name="Access-Control-Allow-Methods" values="*" />   
    </customHeaders> 
    <httpProtocol> 
0

你可以這樣做在MVC

[EnableCors(origins: "*", headers: "*", methods: "*")] 
public ActionResult test() 
{ 
    Response.AppendHeader("Access-Control-Allow-Origin", "*"); 
    return View(); 
} 
0

對於Web表單,您可以使用

Response.AddHeader( 「訪問控制允許來源」, 「*」 );

代替

Response.AppendHeader( 「訪問控制允許來源」, 「*」);

第一個適用於舊版ASP.Net Web窗體。