C# 无法将REST API用于Windows Server 1.1(内部部署)的服务总线

C# 无法将REST API用于Windows Server 1.1(内部部署)的服务总线,c#,rest,azure,servicebus,azureservicebus,C#,Rest,Azure,Servicebus,Azureservicebus,我正在使用Windows服务器服务总线1.1。我能够使用以下基址从WindowServer服务总线生成OAuth令牌 string baseAddressHttp = "https://" + ServerName + ":9355/" + Namespace + "/$STS/OAuth/"; 对于用于向队列发送消息的Windows Azure服务总线,我可以在以下队列地址上发布请求 string serviceNamespace = "ServiceBusDefaul

我正在使用Windows服务器服务总线1.1。我能够使用以下基址从WindowServer服务总线生成OAuth令牌

  string baseAddressHttp = "https://" + ServerName + ":9355/" + Namespace + "/$STS/OAuth/"; 
对于用于向队列发送消息的Windows Azure服务总线,我可以在以下队列地址上发布请求

        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));
但对于Windows Server服务总线,同样的技术不起作用

Windows Server服务总线1.1是否支持REST API? 任何帮助都将不胜感激


提前谢谢

是的,它确实支持它。我们正在使用它

  • 我认为您的默认命名空间端点是错误的-您不需要.servicebus.windows.net
  • 您需要首先使用在服务总线上具有侦听或发送权限的用户的用户名和密码从sts获取令牌
  • 服务总线用户的用户名和密码必须以特定格式发布
  • 然后,您需要将返回的令牌添加到授权标头中,并向/messages端点发出实际的发送或侦听请求
  • 此代码应执行以下操作:

    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));
    }
    
    private const string DefaultNamespace=”https://yoursbserver:9355/servicebusdefaultnamespace";
    私有常量字符串QueueEndpoint=”https://yoursbserver:9355/servicebusdefaultnamespace/YourQueueNameOrTopicName/messages/?timeout=60";
    私有静态void Main()
    {
    var token=GetOAuthTokenFromSts(新Uri(默认名称空间),“UsernameWithPermissionServiceBus”,“password”,TimeSpan.FromMinutes(10));
    var messageXml=CreateXml();
    SendMessage(令牌,messageXml);
    Console.WriteLine(“已成功发布消息!”);
    Console.ReadLine();
    }
    私有静态字符串CreateMessage()
    {
    返回“”;
    }
    公共静态字符串GetOAuthTokenFromSts(Uri namespaceBaseAddress、字符串用户名、字符串用户密码、TimeSpan超时)
    {
    常量字符串stsPath=“$STS/OAuth/”;
    var requestUri=新Uri(namespaceBaseAddress,stsPath);
    var requestContent=GetRequestContent(namespaceBaseAddress、用户名、用户密码);
    var request=CreateRequest(超时、请求URI、请求内容);
    返回GetAccessToken(请求、请求内容);
    }
    私有静态HttpWebRequestCreateRequest(TimeSpan超时,Uri requestUri,字节[]requestContent)
    {
    var request=WebRequest.Create(requestUri)作为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.total毫秒,
    文化信息(不变量文化);
    返回请求;
    }
    私有静态字节[]GetRequestContent(Uri namespaceBaseAddress、字符串用户名、字符串用户密码)
    {
    const string clientPasswordFormat=“grant_type=authorization_code&client_id={0}&client_secret={1}&scope={2}”;
    var requestContent=string.Format(CultureInfo.InvariantCulture,
    clientPasswordFormat,HttpUtility.UrlEncode(用户名),
    HttpUtility.UrlEncode(用户密码),
    UrlEncode(namespaceBaseAddress.AbsoluteUri));
    返回Encoding.UTF8.GetBytes(requestContent);
    }
    私有静态字符串GetAccessToken(HttpWebRequest请求,字节[]requestContent)
    {
    字符串访问令牌;
    使用(var requestStream=request.GetRequestStream())
    {
    Write(requestContent,0,requestContent.Length);
    }
    使用(var response=request.GetResponse()作为HttpWebResponse)
    使用(var stream=response.GetResponseStream())
    使用(var reader=newstreamreader(stream,Encoding.UTF8))
    {
    accessToken=reader.ReadToEnd();
    }
    返回string.Format(CultureInfo.InvariantCulture,“包装访问令牌=\”{0}\”,accessToken);
    }
    私有静态void SendMessage(字符串令牌、字符串消息)
    {
    var webClient=新的webClient();
    webClient.Header[HttpRequestHeader.Authorization]=令牌;
    上传数据(QueueEndpoint,“POST”,Encoding.UTF8.GetBytes(message));
    }
    

  • 我的回答有问题吗?它起作用了!!!太谢谢你了,乔尼奥!!