0

我正在開發Azure MobileService/CordovaApp設置。該服務器在本地運行,並具有以下設置啓用CORS:調試MobileServiceClient請求

<add name="Access-Control-Allow-Origin" value="*" /> 

API可以通過使用瀏覽器的地址被稱爲像

http://localhost:59477/api/item/explore/A/B 

客戶端腳本正試圖描繪這個調用如下:

var client = new WindowsAzure.MobileServiceClient('http://localhost:59477/', 'http://localhost:59477/', ''); 
GetItems.addEventListener("click", 
function() 
{ 
    client.invokeApi("item/explore/A/B", 
     { 
      method: "get" 
     }) 
     .done(
     function (results) 
     { 
      alert(results.result.count); 
     }, 
     function (error) 
     { 
      var xhr = error.request; 
      alert('Error - status code: ' + xhr.status + '; body: ' + xhr.responseText); 
      alert(error.message); 
     } 
    ); 
} 
); 

我得到的是狀態405 - 不允許的方法,這一點我不明白,原因有二:

  • 調用服務行動裝飾用[HTTPGET]屬性
  • 的響應頭好像說GET是好的:
 
    HTTP/1.1 405 Method Not Allowed 
    Allow: GET 
    Content-Length: 76 
    Content-Type: application/json; charset=utf-8 
    Server: Microsoft-IIS/8.0 
    X-SourceFiles: =?UTF-8?B?RjpcQ29kZVxGb290UHJpbnRzXGZvb3RwcmludHMuU2VydmVyXEZvb3RwcmludHNTZXJ2aWNlXGFwaVxmb290cHJpbnRcZXhwbG9yZVw1MS4yNzcwMjJcNy4wNDA3ODM=?= 
    X-Powered-By: ASP.NET 
    Access-Control-Allow-Origin: * 
    Date: Sat, 15 Aug 2015 18:08:30 GMT 

任何想法,我能做些什麼來得到這個運行?


編輯 的原始請求表明,由傑里米·福斯特已經預計,客戶端發送的類型選項的請求:

 
OPTIONS http://localhost:59477/api/fp/get?id=1 HTTP/1.1 
Host: localhost:59477 
Connection: keep-alive 
Access-Control-Request-Method: GET 
Origin: http://localhost:4400 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.155 Safari/537.36 
Access-Control-Request-Headers: accept, x-zumo-features, x-zumo-installation-id, x-zumo-version 
Accept: */* 
Referer: http://localhost:4400/index.html 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4 

我設法支持這一請求應用[HttpOptions]屬性爲我的行動方法。現在我得到一個或多或少有效的迴應:

 
HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8 
Content-Encoding: gzip 
Vary: Accept-Encoding 
Server: Microsoft-IIS/8.0 
X-SourceFiles: =?UTF-8?B?RjpcQ29kZVxGb290UHJpbnRzXGZvb3RwcmludHMuU2VydmVyXEZvb3RwcmludHNTZXJ2aWNlXGFwaVxmcFxnZXRcMQ==?= 
X-Powered-By: ASP.NET 
Access-Control-Allow-Origin: * 
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept 
Date: Sun, 23 Aug 2015 19:34:21 GMT 
Content-Length: 234 

     ... 

至少這就是小提琴手告訴我的。該AzureMobileServiceClient拋出另一個問題,這大致可以翻譯爲:

Cross-Origin request blocked, missing token 'x-zumo-installation-id' in CORS header row 'Access-Control-Allow-Headers' on CORS-Preflight-Channel 
+0

我不確定這是客戶發出OPTIONS請求的錯誤行爲。我猜它實際上是有意的。可能來自OPTIONS請求的錯誤響應優於失敗的GET請求,因此客戶端首先作爲一種「ping」發出OPTIONS。只是一個猜測。在文檔中找不到任何東西(這讓我懷疑)。我正在與一些人覈對。 –

回答

2

打開Fiddler並從瀏覽器試試你的API調用,然後再次使用移動服務客戶端和比較你的原始HTTP請求,看看有什麼不同。

+0

謝謝你指點我小提琴手。詳細的錯誤信息是:'message =請求的資源不支持http方法'OPTIONS'。 –

+0

我已經嘗試並測試了現在在網絡上找到的許多想法,但他們都沒有工作。據我所知,缺少的OPTIONS方法不應該是我打算髮送的請求的顯示屏,但實際上它是... –

+1

嗯。這並不是說缺少OPTIONS方法,而是移動服務客戶端選擇發送HTTP OPTIONS(而不是GET或POST或其他)的HTTP請求。不知道爲什麼。你能發佈導致該錯誤的原始HTTP請求嗎?提琴手會告訴你。 –

1

嘗試運行CORS支持此博客帖子的部分:http://azure.microsoft.com/blog/2014/07/28/azure-mobile-services-net-updates/

附註:您收到的x-zumo-installation-id錯誤是因爲客戶端請求訪問頭部列表(請參閱您的請求中的Access-Control-Request-Headers),並且服務器未返回相同的列表Access-Control-Allow-Headers標題。使用上述博客文章中提到的MS_CrossDomainOrigins設置通過將默認允許標題設置爲*(全部)來解決此問題。