2014-07-12 75 views
1

在過去的兩天裏,我一直在使用webapi(asp.net)和ajax查詢。我已經可能在互聯網上閱讀所有可能的解決方案,但它仍然不能在我的機器上工作。CORS操作被取消

步驟I已與簡單的示例項目(NB:localhostLH取代):嘗試

  1. [NOT WORKING]

    public static void Register(HttpConfiguration config) 
    { 
        config.EnableCors(new EnableCorsAttribute("*", "*", "*")); 
        // omitted 
    } 
    
  2. [NOT WORKING]

    [EnableCors("*", "*", "GET,POST,PUT,OPTIONS")] 
    public class ValuesController : ApiController 
    { /* code goes here */} 
    
  3. [不工作]

    [EnableCors("*","*","PUT")] 
    public void Put(int id, string value) 
    { 
        values[id] = value; 
    } 
    
  4. [不工作]
    我還沒有嘗試添加這些:

    <httpProtocol> 
    <customHeaders> 
        <add name="Access-Control-Allow-Origin" value="*" /> 
        <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE,OPTIONS" /> 
        <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
    </customHeaders> 
    </httpProtocol> 
    
  5. [不工作]
    而對於最後我做了與使用IIS管理的第4點相同的內容。從FF F12工具網絡面板

結果:

GET LH:8821/api/values 200 OK     229ms ["Item1", "Item2", "Item3"] 
PUT LH:8821/api/values 405 Method Not Allowed 114ms "NetworkError: 405 Method Not Allowed - LH:8821/api/values" 
POST LH:8821/api/values 405 Method Not Allowed 123ms "NetworkError: 405 Method Not Allowed - LH:8821/api/values" 

是不是我做錯了什麼,還是我失去了一些其他的設置?

我取得的最好結果是GETPOST工作,但後來談到PUT我總是得到405--爲什麼?

回答

1

對於某些CORS請求,瀏覽器/ jQuery/ajax在發送實際資源請求之前會發送一個稱爲「預檢請求」的附加請求,因爲跨站點請求可能會影響用戶數據。

  • 該請求的方法是GETHEAD,或POST
  • 應用程序沒有設置:如果滿足以下條件,則

    的瀏覽器/ jQuery的/ AJAX可以跳過預檢請求任何除Accept,Accept-Language,Content-Language,Content-Type或Last-Event-ID以外的請求標頭,

  • Content-Type標頭(如果設置)是f ollowing:
    • 應用程序/ x-WWW窗體-urlencoded
    • 的multipart/form-data的
    • 純文本/

上面僅稍微適應在this link從信息(在「預檢請求」下)。

不同於簡單請求,「preflighted」請求首先將OPTIONS方法發出的HTTP請求發送到另一個域上的資源,以確定實際請求是否安全發送。

我的猜測是,你不必在你的控制器處理OPTIONS的操作方法,所以你得到一個405,即錯誤涉及「隱身」 OPTIONS要求,而不是你的PUT。以最簡單的形式,你可以在你的控制器中實現一個像這樣的操作方法。

public HttpResponseMessage Options() 
{ 
    var response = new HttpResponseMessage(); 
    response.StatusCode = HttpStatusCode.OK; 
    return response; 
} 

此外,它可以幫助如果禁用WebDAV IIS組件,並設置在web.config中runAllManagedModulesForAllRequests="true"設置:

<system.webServer> 
    <modules runAllManagedModulesForAllRequests="true"> 
    <remove name="WebDAVModule"/> 
    </modules> 
    <handlers> 
    <remove name="WebDAV" /> 
    </handlers> 
</system.webServer> 

我敢肯定你已經讀了關於很多文章這個,所以你可能已經試過了我已經說過的一些或全部,但是,因爲它沒有在你的問題中說過,所以我認爲這裏值得一提。

順便說一句,如果你沒有看過這個已經,this article by Brock Allen是絕對不可不看的人在網絡API與CORS搞亂約2

+0

感謝長期的答覆:)我經歷的文章試圖找到我從這些該死的頭文件中丟失的東西。 與webDav伎倆沒有解決我的問題。 – jstadnicki

+0

@jstadnicki:不客氣。我只希望它能以某種方式幫助你。 – djikay