亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 HTTP 添加 Azure 服務總線規則

通過 HTTP 添加 Azure 服務總線規則

C#
翻閱古今 2022-01-15 15:34:32
我正在更改我的代碼從 Azure 服務總線訂閱接收消息的方式。以前我使用的是 SDK 類,現在我正在更改為 http REST 調用。為了為訂閱創建規則并為此規則設置過濾器,我總是收到 http 400 作為返回??磥砦覄摻ㄉ眢w的方式不正確:            var rule = $"https://{serviceBusNamespace}.servicebus.windows.net/{topicPath}/subscriptions/{subscriptionName}/rules/{ruleName}";            var content = new StringContent(@"<RuleDescription xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"">             < Filter i: type = ""SqlFilter"" >              < SqlExpression > type = 'REPLY' AND username = '[email protected]' </ SqlExpression >             </ Filter >            </ RuleDescription >            ", Encoding.UTF8, "application/xml");            var requestResponse = await _httpClient.PutAsync(rule, content, new System.Threading.CancellationToken());我還設置了以下標題:_httpClient.DefaultRequestHeaders.Add("Authorization", _token);                _httpClient.DefaultRequestHeaders.Add("ContentType", "application/atom+xml");                _httpClient.DefaultRequestHeaders.Add("Accept", "application/atom+xml");關于缺少什么的任何想法?
查看完整描述

1 回答

?
慕田峪7331174

TA貢獻1828條經驗 獲得超13個贊

根據錯誤信息表示請求參數錯誤。我對提到的api不熟悉,如果可能的話,你可以分享鏈接。


但我建議您可以使用規則 - 創建或更新。我們很容易使用。有關服務總線 api 的更多信息,請參閱此文檔。


PUT https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ServiceBus/namespaces/{namespaceName}/topics/{topicName}/subscriptions/{subscriptionName}/rules/{ruleName}?api-version=2017-04-01

我也為它做了一個演示。


1)獲取訪問令牌


private static async Task<string> GetToken(string tenantId, string clientId, string secretKey)

        {

            var context = new AuthenticationContext("https://login.windows.net/" + tenantId);

            ClientCredential clientCredential = new ClientCredential(clientId, secretKey);

            var tokenResponse = await context.AcquireTokenAsync("https://management.azure.com/", clientCredential);

            var accessToken = tokenResponse.AccessToken;

            return accessToken;

        }

2)關于如何獲取tenantId、clientId和秘鑰請參考本教程。并且不要忘記分配應用程序的角色。


var tenantId = "tenantId";

var clientId = "clientId";

var secretkey = "sercret Key";

var subscriptionId = "subscription Id";

var resurceGroup = "resourceGroup";

var nameSpace = "servicebus namespace";

var topicName = "topicName";

var subscription = "service subscription name";

var ruleName = "rule name";

var token = GetToken(tenantId,clientId,secretkey).Result;

using (var httpClient = new HttpClient())

{

   httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);

   httpClient.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json"));

   var body = "{\"properties\": { \"filterType\": \"SqlFilter\"},\"sqlExpression\": { \"sqlExpression\": \"myproperty=test\"}}";

   HttpContent content = new StringContent(body);

   var url = $"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/{resurceGroup}/providers/Microsoft.ServiceBus/namespaces/{nameSpace}/topics/{topicName}/subscriptions/{subscription}/rules/{ruleName}?api-version=2017-04-01";

   var response = httpClient.PutAsync(url, content).Result;

 }

測試結果

http://img1.sycdn.imooc.com//61e27923000126ff10970276.jpg

更新:


看來我創建身體的方式不正確:


是的,你是對的。根據您提到的API 文檔,我們可以知道正文是 xml 格式。但是您的 xml 代碼字符串不是 xml 格式,您可以在線使用 xml 驗證器。<字符/>和標簽之間不應有空格。例如 < Filter i: type = ""SqlFilter"">應該是<Filter i: type = ""SqlFilter"">


但它是一個經典的rest api。


我們不再定期更新此內容。有關如何支持此產品、服務、技術或 API 的信息,請查看 Microsoft 產品生命周期。


我建議您可以使用 Azure 管理 API,我們也可以使用api獲取訪問令牌。


public static string GenerateAccessToken(string resource, string tenantId, string clientId,string secretKey)

        {

            var url = $"https://login.microsoftonline.com/{tenantId}/oauth2/token";

            var body = $"grant_type=client_credentials&client_id={clientId}&client_secret={secretKey}&resource={resource}";

            HttpClient client = new HttpClient

            {

                BaseAddress = new Uri(url)

            };

            StringContent content = new StringContent(body);

            content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded");

            var result = client.PostAsync(url, content).Result;

            var json = JObject.Parse (result.Content.ReadAsStringAsync().Result);

            return json["access_token"].ToString();

        }

如果你還想用經典的api,我也做了一個demo。請嘗試以下代碼。


1.獲取sastoken代碼


public static string GetSasToken(string resourceUri, string keyName, string key, TimeSpan ttl)

  {

         var expiry = GetExpiry(ttl);

         string stringToSign = HttpUtility.UrlEncode(resourceUri) + "\n" + expiry;

         HMACSHA256 hmac = new HMACSHA256(Encoding.UTF8.GetBytes(key));

         var signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign)));

         var sasToken = string.Format(CultureInfo.InvariantCulture, "SharedAccessSignature sr={0}&sig={1}&se={2}&skn={3}",

         HttpUtility.UrlEncode(resourceUri), HttpUtility.UrlEncode(signature), expiry, keyName);

         return sasToken;

 }


private static string GetExpiry(TimeSpan ttl)

{

  TimeSpan expirySinceEpoch = DateTime.UtcNow - new DateTime(1970, 1, 1) + ttl;

   return Convert.ToString((int)expirySinceEpoch.TotalSeconds);

 }

2.用c#代碼創建規則。


var serviceBusNamespace = "serviceBusNameSpace";

var topicPath = "topicPath";

var subscriptionName = "subscription name";

var ruleName = "testrule2"; // rule name

var sharedAccessKeyName = "xxxSharedAccessKey",

var key = "xxxxxxM2Xf8uTRcphtbY=";

var queueUrl = $"https://{serviceBusNamespace}.servicebus.windows.net/{topicPath}/subscriptions/{subscriptionName}/rules/{ruleName}";

var token = GetSasToken(queueUrl, sharedAccessKeyName,key ,TimeSpan.FromDays(1));

            var body = @"<entry xmlns=""http://www.w3.org/2005/Atom"">

   <content type =""application/xml"" >

   <RuleDescription xmlns:i=""http://www.w3.org/2001/XMLSchema-instance"" xmlns=""http://schemas.microsoft.com/netservices/2010/10/servicebus/connect"">

           <Filter i:type=""SqlFilter"">

               <SqlExpression> type = 'REPLY' AND username = '[email protected]' </SqlExpression>

             </Filter>

           </RuleDescription>

         </content>

       </entry>";

            var length = body.Length.ToString();

            var content = new StringContent(body, Encoding.UTF8, "application/xml");

            var _httpClient = new HttpClient();

            _httpClient.DefaultRequestHeaders.Add("Authorization", token);

            _httpClient.DefaultRequestHeaders.Add("ContentType", "application/atom+xml");

            _httpClient.DefaultRequestHeaders.Add("Accept", "application/atom+xml");

            content.Headers.Add("Content-Length", length);

            var requestResponse =  _httpClient.PutAsync(queueUrl, content, new System.Threading.CancellationToken()).Result;

測試結果:

http://img1.sycdn.imooc.com//61e2793300011bad12490474.jpg

查看完整回答
反對 回復 2022-01-15
  • 1 回答
  • 0 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號