问题
I am using the Window Server Service Bus 1.1. I am able to generate the OAuth token from the Window Server Service Bus using the following base address
string baseAddressHttp = "https://" + ServerName + ":9355/" + Namespace + "/$STS/OAuth/";
For Window Azure Service Bus for sending a message to queue i can POST a request on the following queue address
string serviceNamespace = "ServiceBusDefaultNamespace";
string queueName = "SampleQueuName";
string message ="This is my first message";
string queueAddress = "https://" + serviceNamespace + ".servicebus.windows.net/"+ queueName + "/messages";
WebClient webClient = new WebClient();
webClient.Headers[HttpRequestHeader.Authorization] = token;
webClient.UploadData(baseAddress, "POST", Encoding.UTF8.GetBytes(message));
But for window Server Service Bus what same technique doesn't work.
Does Window Server Service Bus 1.1 support the REST API? Any help will be really appreciated.
Thanks in advance!!
回答1:
yes it does support it. We are using it.
- I think your default namespace endpoint is wrong - you dont need .servicebus.windows.net
- you need to get a token from the sts first using a username and password of a user that has listen or send permissions on service bus.
- the username and password of the service bus user must be posted in a specific format.
- Then you need to add the token that is returned into the authorisation header and make your actual send or listen request to the /messages endpoint.
This code should do it:
private const string DefaultNamespace = "https://yoursbserver:9355/servicebusdefaultnamespace"; private const string QueueEndpoint = "https://yoursbserver:9355/servicebusdefaultnamespace/YourQueueNameOrTopicName/messages/?timeout=60"; private static void Main() { var token = GetOAuthTokenFromSts(new Uri(DefaultNamespace), "usernamewithpermissiononServiceBus", "password", TimeSpan.FromMinutes(10)); var messageXml = CreateXml(); SendMessage(token, messageXml); Console.WriteLine("Successfully posted message!"); Console.ReadLine(); } private static string CreateMessage() { return "<SomeMessage xmlns='MyNamespace'></SomeMessage>"; } public static string GetOAuthTokenFromSts(Uri namespaceBaseAddress, string userName, string userPassword, TimeSpan timeout) { const string stsPath = "$STS/OAuth/"; var requestUri = new Uri(namespaceBaseAddress, stsPath); var requestContent = GetRequestContent(namespaceBaseAddress, userName, userPassword); var request = CreateRequest(timeout, requestUri, requestContent); return GetAccessToken(request, requestContent); } private static HttpWebRequest CreateRequest(TimeSpan timeout, Uri requestUri, byte[] requestContent) { var request = WebRequest.Create(requestUri) as HttpWebRequest; request.ServicePoint.MaxIdleTime = 5000; request.AllowAutoRedirect = true; request.MaximumAutomaticRedirections = 1; request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = requestContent.Length; request.Timeout = Convert.ToInt32(timeout.TotalMilliseconds, CultureInfo.InvariantCulture); return request; } private static byte[] GetRequestContent(Uri namespaceBaseAddress, string userName, string userPassword) { const string clientPasswordFormat = "grant_type=authorization_code&client_id={0}&client_secret={1}&scope={2}"; var requestContent = string.Format(CultureInfo.InvariantCulture, clientPasswordFormat, HttpUtility.UrlEncode(userName), HttpUtility.UrlEncode(userPassword), HttpUtility.UrlEncode(namespaceBaseAddress.AbsoluteUri)); return Encoding.UTF8.GetBytes(requestContent); } private static string GetAccessToken(HttpWebRequest request, byte[] requestContent) { string accessToken; using (var requestStream = request.GetRequestStream()) { requestStream.Write(requestContent, 0, requestContent.Length); } using (var response = request.GetResponse() as HttpWebResponse) using (var stream = response.GetResponseStream()) using (var reader = new StreamReader(stream, Encoding.UTF8)) { accessToken = reader.ReadToEnd(); } return string.Format(CultureInfo.InvariantCulture, "WRAP access_token=\"{0}\"", accessToken); } private static void SendMessage(string token, string message) { var webClient = new WebClient(); webClient.Headers[HttpRequestHeader.Authorization] = token; webClient.UploadData(QueueEndpoint, "POST", Encoding.UTF8.GetBytes(message)); }
来源:https://stackoverflow.com/questions/21678274/not-able-to-use-rest-api-for-service-bus-for-windows-server-1-1-onpremises