3

助けてください!!MSDN から提供されたこの単純なコードが機能しない理由がわかりません....

Windows 通知で使用されるアクセス トークンを取得するために、この MSDN 記事に記載されているように、GetAccessToken() で次のコードを使用していますが、「Bad Request 400」が返されます。

PACKAGE_SECURITY_IDENTIFIER、CLIENT_SECRET は、アプリが 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);
}

どんな助けでも大歓迎です.......

4

3 に答える 3

3

問題は、パッケージIDが正しくないか、クライアントシークレットが正しくないことに関係していると思われます。

MSDNページからプッシュ通知サービスの要求および応答ヘッダー

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

更新-FAKEクレデンシャルを使用して、質問からコードを実行しました。

RAWHTTPリクエストは次のとおりです。

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

サーバーのRAW応答は次のとおりです。

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"}

応答が400であることに注意してください。エラーの種類を示すjsonもあります。私の場合、エラーはInvalid client idです。あなたはおそらくあなたの反応を見たいと思うでしょう-それはあなたに何が起こったのかを示すでしょう。

Fiddlerを使用して要求/応答をデバッグしました。

于 2013-03-20T19:56:40.783 に答える
2

エラー応答の理由がわかりました。実際、間違った PACKAGE_SECURITY_IDENTIFIER と CLIENT_SECRET です。

値を入力しないでください。関連する ASCII 値が異なるためです。したがって、直接コピーして貼り付ける方が常に優れています。

おそらく、単純なコード スニペットでアクセス トークンを取得できます。

乾杯

于 2013-03-29T10:37:39.897 に答える
0

新しい HttpClient API を使用していて、SID/シークレットの値を正しくコピー アンド ペーストしたことが確実な場合は、FormUrlEncodedContentクラスを POST のコンテンツとして使用している場合、エンコーディングが原因でこの問題が発生している可能性があります。手術。

MSDN ドキュメントの例とは対照的に、KeyValuePair コレクションに追加する前に SID とシークレットの値を URL エンコードする必要はありません。これは、エンコーディングがクラスによって暗示されているためですが、この動作に関するドキュメントFormUrlEncodedContentは見当たりません。私は一晩中これに取り組んできたので、これが誰かの時間を節約できることを願っています...

于 2014-08-05T05:26:53.050 に答える