2017-08-01 39 views
2

我正在使用WCF(.svc)WebService,它的工作完美 - 我可以在沒有Postman,PHP等問題的情況下調用它的方法。但是,當我嘗試從調用它時,JavaScript/jQuery使用AJAX,存在一個明顯的問題 - 我從WS以外的其他域執行它,所以它不會讓我這樣做。從JavaScript訪問WCF WebService - 對預檢請求的響應沒有通過訪問控制檢查

這完全是關於POST方法。但即使我的網頁首先發送OPTIONS方法的問題:

OPTIONS 'WS地址' 405(不允許的方法)

的XMLHttpRequest無法加載'WS地址'對預檢請求的響應不會 通過訪問控制檢查:請求的資源上不存在「Access-Control-Allow-Origin」標頭 。產地'我的地址'因此不允許 訪問。響應有HTTP狀態代碼405

有詳細的答覆:

Responses

好吧,我讀到跨域和WS的Web.config包含所有的它是必要的(? )

Web.config

請讓我知道我做錯了,我不能達到從JavaScript我的WS,儘管在我看來,C ^形狀良好。但仍然,似乎不發送這些特殊的標題作爲迴應...在此先感謝。

+0

405代碼表示您的服務器配置爲禁止OPTIONS請求。這就是*方法不允許*消息的含義。您必須將其配置爲使用200或204成功消息和正確的Access-Control-Allow- *標頭響應OPTIONS請求。至於如何做到這一點,聽起來像你需要閱讀更多的文檔,並進一步研究 - 開始在https://stackoverflow.com/questions/16024347/cross-origin-resource-sharing-for-c-sharp- wcf-restful-web-service-hosted-as-wind/16039951#16039951&https://stackoverflow.com/questions/43911702/405-method-not-allowed-wcf-service-and-ionic – sideshowbarker

回答

1

XML HttpRequest允許將數據從Web服務器傳輸到瀏覽器。但是,瀏覽器默認阻止CORS。 GET請求不會改變服務器端的任何內容(沒有任何內容會被創建/更新/刪除) - 它只會返回一些數據。

但是,POST/PUT/DELETE請求會處理請求並在服務器端改變某些內容並向瀏覽器發出響應。如果響應沒有正確的Access-Control-Allow-Origin標題,瀏覽器將阻止響應。但是這並不重要,因爲在響應發出時,服務器已經處理了請求並進行了更改,可能是對數據庫進行了更改。

爲了防止在服務器端處理POST/PUT/DELETE請求,瀏覽器會發送一個preflight request

prefligth請求是使用方法OPTIONS的http請求。因此,在發送POST請求之前,瀏覽器將發送一個OPTIONS請求,並附帶一個名爲Access-Control-Request-Method的標題,其值爲POST。

405 (Method Not Allowed)錯誤表示服務器未配置爲接受OPTIONS請求。

您可以使用通配符類似這樣您的Web調用方法解決這個問題:

[OperationContract] 
[WebInvoke(Method = "*", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)] 

或通過添加額外的[OperationContract][ServiceContract],處理OPTIONS請求與此類似:

[OperationContract(Name = "OptionsMyFunction")] 
[WebInvoke(Method = "OPTIONS", UriTemplate = "/Path", ResponseFormat = WebMessageFormat.Json)] 
相關問題