不能够使用REST API的服务总线的Windows服务器1.1(premises) [英] Not able to use REST API for Service Bus for Windows Server 1.1 (OnPremises)

查看:133
本文介绍了不能够使用REST API的服务总线的Windows服务器1.1(premises)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Window服务器服务总线1.1。我可以用下面的基址,以产生从Window服务器服务总线OAuth令牌

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/"; 

有关窗的Azure服务总线用于发送消息来排队,我可以张贴在以下队列地址的请求

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.

请问Window服务器服务总线1.1支持REST API?
任何帮助将是非常美联社preciated。

Does Window Server Service Bus 1.1 support the REST API? Any help will be really appreciated.

在此先感谢!

推荐答案

是它不支持它。我们正在使用它。

yes it does support it. We are using it.


  1. 我觉得你默认命名空间端点是错误的 - 你不需要的 .servicebus.windows.net

  2. 您需要得到从STS令牌首先使用具有监听或服务总线上发送权限的用户的用户名和密码。

  3. 的用户名和服务总线的用户密码必须张贴在一个特定的格式。

  4. 然后你需要添加一个返回到授权头令牌,让您的实际发送或收听请求/消息端点。

  5. 这code应该这样做:

  1. I think your default namespace endpoint is wrong - you dont need .servicebus.windows.net
  2. 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.
  3. the username and password of the service bus user must be posted in a specific format.
  4. 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.
  5. 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));
}


这篇关于不能够使用REST API的服务总线的Windows服务器1.1(premises)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆