2013-03-20 19 views
3

請幫助!想不通爲什麼通過MSDN給出的這個簡單的代碼不工作....Windows推送通知返回錯誤請求400

我使用作爲this MSDN article給獲得訪問令牌GetAccessToken()下面的代碼在Windows中使用通知,但它返回「無效請求400」時,應用程序與Windows應用商店儀表板

string urlEncodedSid = HttpUtility.UrlEncode(PACKAGE_SECURITY_IDENTIFIER); 
string urlEncodedSecret = HttpUtility.UrlEncode(CLIENT_SECRET); 

string body = String.Format("grant_type=client_credentials&client_id={0}&client_secret={1}&scope=notify.windows.com", urlEncodedSid, urlEncodedSecret); 

string response; 

using (WebClient client = new WebClient()) 
{ 
    client.Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
    response = client.UploadString("https://login.live.com/accesstoken.srf", body); 
} 

任何幫助,將不勝感激註冊獲得

PACKAGE_SECURITY_IDENTIFIER,CLIENT_SECRET值...... 。

+0

[Fetching AccessToken返回「400 - Bad Request」用於通過WNS驗證雲服務](http://stackoverflow.com/questions/15105405/fetching-accesstoken-returns-400-bad-request-for-認證,雲服務) – 2013-03-20 20:41:08

+0

@ConradFrix - 嗯我投票結束你關聯的問題。我們不應該關閉它們兩個! – 2013-03-20 22:01:04

回答

2

我找到了錯誤響應的原因。實際上它是錯誤的PACKAGE_SECURITY_IDENTIFIER和CLIENT_SECRET。

請勿輸入值。由於關聯的ASCII值不同。因此,直接複製和粘貼總是更好。

您可能會通過簡單的代碼段獲取訪問令牌。

乾杯

+0

我有同樣的問題,但它發現'400錯誤請求'的返回值有點誤導,因爲它暗示了請求中的一些語法錯誤,而不是認證問題。 – Codor 2014-09-29 07:34:15

3

我懷疑問題與不正確的包標識符和/或不正確的客戶端密鑰有關。

Push notification service request and response headers的MSDN頁:

RESPONSE   DESCRIPTION 
--------------- -------------------------- 
200 OK   The request was successful. 
400 Bad Request The authentication failed. 

更新 - 我跑的代碼的問題,使用假證件。

這裏是RAW HTTP請求:

POST https://login.live.com/accesstoken.srf HTTP/1.1 
Content-Type: application/x-www-form-urlencoded 
Host: login.live.com 
Content-Length: 88 
Expect: 100-continue 
Connection: Keep-Alive 

grant_type=client_credentials&client_id=test&client_secret=test&scope=notify.windows.com 

這裏是服務器的原始響應:

HTTP/1.1 400 Bad Request 
Cache-Control: no-store 
Content-Length: 66 
Content-Type: application/json 
Server: Microsoft-IIS/7.5 
X-WLID-Error: 0x80045A78 
PPServer: PPV: 30 H: BAYIDSLGN2A055 V: 0 
Date: Thu, 21 Mar 2013 12:34:19 GMT 
Connection: close 

{"error":"invalid_client","error_description":"Invalid client id"} 

你會注意到,響應是。還有一些json指出錯誤的類型。在我的情況,錯誤是Invalid client id。你可能想看看你的反應 - 它會給你一個發生了什麼事情的跡象。我使用Fiddler調試請求/響應。

+0

400錯誤請求.........這表明存在與協議有關的錯誤!該請求正在被服務器拒絕。 我懷疑如果PACKAGE_SECURITY_IDENTIFIER或CLIENT_SECRET是錯誤的,那麼它應該返回一些其他的錯誤代碼;類似500. 錯誤代碼400意味着請求被髮送,但被服務器關閉。不是嗎? – 2013-03-21 04:52:17

+0

更改PACKAGE_SECURITY_IDENTIFIER或CLIENT_SECRET後,是否可以獲取訪問令牌? – 2013-03-21 05:07:33

+0

@Kasun - 我沒有親自嘗試獲取訪問令牌。關於400 - 請看我提供的鏈接。它說,對於這個請求,400意味着認證失敗。 – 2013-03-21 11:44:50

0

如果您正在使用新的HttpClient的API和你確定你複製和粘貼的SID /機密值正確,您可能會遇到,因爲這種編碼的問題,提供你使用FormUrlEncodedContent類作爲POST操作的內容。

MSDN documentation中的示例相反,您不希望在將它們添加到KeyValuePair集合之前對SID和祕密值進行URL編碼。這是因爲FormUrlEncodedContent類暗示了編碼,儘管我沒有看到此行爲的任何documentation。希望這能節省一些時間,因爲我一整晚都在摔跤......