无法将 REST API 用于 Windows Server 1.1 (OnPremises) 的服务总线 [英] Not able to use REST API for Service Bus for Windows Server 1.1 (OnPremises)

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

问题描述

我使用的是 Window Server Service Bus 1.1.我能够使用以下基地址从 Window Server Service Bus 生成 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/"; 

对于用于向队列发送消息的 Window 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 Server Service Bus 1.1 是否支持 REST API?任何帮助将不胜感激.

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. 然后,您需要将返回的令牌添加到授权标头中,并向/messages 端点发出实际的发送或侦听请求.
  5. 这段代码应该可以:

  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 Server 1.1 (OnPremises) 的服务总线的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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