1 回答

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;
}
測試結果
更新:
看來我創建身體的方式不正確:
是的,你是對的。根據您提到的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;
測試結果:
- 1 回答
- 0 關注
- 171 瀏覽
添加回答
舉報