0

API RESTの4つのメソッドをコーディングするだけですが、最後に必要なのは機能していません。これはメッセージキューを削除しています。私はこのコードを持っています:

public static string DeleteMessage(String queueName, string account, byte[] key, string endpoint, string popreceipt,string messageid)
    {
        string requestMethod = "DELETE";

        String urlPath = String.Format("{0}/messages/{1}?popreceipt={2}", queueName,Uri.EscapeDataString(messageid),Uri.EscapeDataString(popreceipt));

        String storageServiceVersion = "2009-09-19";
        String dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
        String canonicalizedHeaders = String.Format(
              "x-ms-date:{0}\nx-ms-version:{1}",
              dateInRfc1123Format,
              storageServiceVersion);
        String canonicalizedResource = String.Format("/{0}/{1}", account, urlPath);
        //String canonicalizedResource = String.Format("/{0}/{1}\npopreceipt:{2}", account, urlPath, popreceipt);
        String stringToSign = String.Format(
              "{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}",
              requestMethod,
              canonicalizedHeaders,
              canonicalizedResource);
        String authorizationHeader = CreateAuthorizationHeader(stringToSign, account, key);

        Uri uri = new Uri(endpoint + urlPath);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = requestMethod;
        request.Headers.Add("x-ms-date", dateInRfc1123Format);
        request.Headers.Add("x-ms-version", storageServiceVersion);
        request.Headers.Add("Authorization", authorizationHeader);

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            Stream dataStream = response.GetResponseStream();

            return response.StatusCode.ToString();

        }
    }

    public static string GetMessage(String queueName,string account, byte[] key,string endpoint)
    {
        string requestMethod = "GET";

        String urlPath = String.Format("{0}/messages", queueName);

        String storageServiceVersion = "2009-09-19";
        String dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
        String canonicalizedHeaders = String.Format(
              "x-ms-date:{0}\nx-ms-version:{1}",
              dateInRfc1123Format,
              storageServiceVersion );
        String canonicalizedResource = String.Format("/{0}/{1}", account, urlPath);
        String stringToSign = String.Format(
              "{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}",
              requestMethod,
              canonicalizedHeaders,
              canonicalizedResource);
        String authorizationHeader = CreateAuthorizationHeader(stringToSign,account,key);

        Uri uri = new Uri(endpoint + urlPath);
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.Method = requestMethod;
        request.Headers.Add("x-ms-date", dateInRfc1123Format);
        request.Headers.Add("x-ms-version", storageServiceVersion );
        request.Headers.Add("Authorization", authorizationHeader);
        request.Accept = "application/atom+xml,application/xml";

        using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
        {
            Stream dataStream = response.GetResponseStream();
            using (StreamReader reader = new StreamReader(dataStream))
            {
                String responseFromServer = reader.ReadToEnd();

                return responseFromServer;
            }
        }
    }

GetMessageは機能しているだけで、DeleteMessageは機能していません。CreateAuthorithationヘッダーコードは次のとおりです。

     private static String CreateAuthorizationHeader(String canonicalizedString, string account, byte[] key)
    {
        String signature = string.Empty;
        using (HMACSHA256 hmacSha256 = new HMACSHA256(key))
        {
            Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(canonicalizedString);
            signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
        }

        String authorizationHeader = String.Format(
              CultureInfo.InvariantCulture,
              "{0} {1}:{2}",
              "SharedKey",
              account,
              signature);

        return authorizationHeader;
    }

GetMessage(およびputメッセージの別のメソッド)で機能する「Convert.FromBase64String(AccountSharedKey)」を使用してKEYを渡しますが、これはDELETINGTHEMESSAGEでは機能しません。

MSDNのAPIを確認し、DELETEメッセージとGETメッセージは、クエリ文字列によって渡されるパラメーターを除いて、同じパラメーターを使用します。

解決済み

問題は、Uri文字列のパラメーターにUriEscapeを使用しないことでした。また、URLが有効な場合と、そうでない場合がありました。

4

2 に答える 2

0

「canonicalizedResource」文字列の作成方法に問題があると思います。http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx(「正規化されたリソース文字列の構築」というタイトルのセクションまでスクロールダウン)のドキュメントに基づいて、クエリを渡さないでください。メインの正規化されたリソース文字列の一部としての文字列パラメータ。それらは別々に追加する必要があります。

次の作品を使用しているかどうかを確認できますか?

            string canonicalizedResource = string.Format("/{0}/{1}/messages/{2}\npopreceipt:{3}", account, queueName, messageid, popreceipt);

お役に立てれば。

于 2012-11-22T02:03:41.813 に答える
0

次のコードを試してみましたが、うまくいきました。キューを作成し、メッセージを挿入して「GET」メッセージを送信し、ポップレシートを取得してから、メッセージを削除しました。私があなたのコードで変更したのは、上記の私の答えに基づくcanonicalizedResource文字列だけです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Web;
using System.IO;
using System.Security.Cryptography;
using System.Globalization;

namespace ConsoleApplication15
{
    class Program
    {
        static void Main(string[] args)
        {
            string messageId = "<message id e.g. ba9bdbe6-cd10-465d-ab32-90756ea0471d>";
            string queueName = "<queue name e.g. abc>";
            string accountName = "<your account name>";
            string accountKey = "<you account key base64 encoded string>";
            string endpoint = "http://accountname.queue.core.windows.net/";
            string popreceipt = "<pop receipt e.g. AgAAAAEAAAAAAAAACuMLtGTIzQE=>";

            var result = DeleteMessage(queueName, accountName, Convert.FromBase64String(accountKey), endpoint,
                popreceipt, messageId);
        }

        public static string DeleteMessage(String queueName, string account, byte[] key, string endpoint, string popreceipt, string messageid)
        {
            string requestMethod = "DELETE";

            String urlPath = String.Format("{0}/messages/{1}?popreceipt={2}", queueName, Uri.EscapeDataString(messageid), Uri.EscapeDataString(popreceipt));

            String storageServiceVersion = "2009-09-19";
            String dateInRfc1123Format = DateTime.UtcNow.ToString("R", CultureInfo.InvariantCulture);
            String canonicalizedHeaders = String.Format(
                  "x-ms-date:{0}\nx-ms-version:{1}",
                  dateInRfc1123Format,
                  storageServiceVersion);
            String canonicalizedResource = string.Format("/{0}/{1}/messages/{2}\npopreceipt:{3}", account, queueName, messageid, popreceipt);
            String stringToSign = String.Format(
                  "{0}\n\n\n\n\n\n\n\n\n\n\n\n{1}\n{2}",
                  requestMethod,
                  canonicalizedHeaders,
                  canonicalizedResource);
            String authorizationHeader = CreateAuthorizationHeader(stringToSign, account, key);

            Uri uri = new Uri(endpoint + urlPath);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Method = requestMethod;
            request.Headers.Add("x-ms-date", dateInRfc1123Format);
            request.Headers.Add("x-ms-version", storageServiceVersion);
            request.Headers.Add("Authorization", authorizationHeader);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                Stream dataStream = response.GetResponseStream();

                return response.StatusCode.ToString();

            }
        }

        private static String CreateAuthorizationHeader(String canonicalizedString, string account, byte[] key)
        {
            String signature = string.Empty;
            using (HMACSHA256 hmacSha256 = new HMACSHA256(key))
            {
                Byte[] dataToHmac = System.Text.Encoding.UTF8.GetBytes(canonicalizedString);
                signature = Convert.ToBase64String(hmacSha256.ComputeHash(dataToHmac));
            }

            String authorizationHeader = String.Format(
                  CultureInfo.InvariantCulture,
                  "{0} {1}:{2}",
                  "SharedKey",
                  account,
                  signature);

            return authorizationHeader;
        }
    }
}
于 2012-11-22T03:58:09.300 に答える