6

Microsoft Service Bus を使い始めたところです。現在、私の個人的な課題は、これを勤務時間外や自分の時間などに行っていることです。つまり、VM と非ドメイン PC を使用しています。これらの人はすべてワークグループです。

特にこのリンクに出くわした後は、かなりの成功を収めました: Microsoft Service Bus 1.0 cannot communicate with a server outside the client's domain

この男は、名前空間を使用してキューを作成することができなくなるなど、非常に必要なブーストを提供してくれました。

しかし、私は QueueClient.Send() 関数にたどり着きましたが、まだ得ています (そして、少し言い換えました)。

"The token provider was unable to provide a security token while accessing 'https://Windows2008Server:9355/ServiceBusDefaultNamespace/$STS/Windows/'. Token provider returned message: ''.

上記のリンクからの同じコードは、メッセージ ファクトリに使用しているものです。だから私の質問は、このセンド・トゥ・ワークを乗り越える方法について何かアイデアを持っている人はいますか?

この小さな問題を乗り越えることができれば、Service Bus が実際にできることを確認できるようになります。

本当にありがとう!

ニック


以前と同じ問題で、コードを次のように変更しました。

        TokenProvider localUserTokenProvider = WindowsTokenProvider.CreateWindowsTokenProvider(connBuilder.StsEndpoints,new System.Net.NetworkCredential("LocalServer", "LocalPassword"));

        MessagingFactory messageFactory = MessagingFactory.Create(connBuilder.GetAbsoluteRuntimeEndpoints(), localUserTokenProvider);
        NamespaceManager namespaceManager = new NamespaceManager(connBuilder.GetAbsoluteManagementEndpoints(), localUserTokenProvider);

そのため、両方で同じアカウントを使用する必要があるようです...

4

4 に答える 4

2

クライアントとサーバーが異なるマシン上にある場合、証明書の信頼に問題がある可能性があります。を使用してサーバー マシンから Service Bus Server CA をエクスポートし、Service Bus for Windows Server PowerShell コンソールを開き、Get-SBAutoGeneratedCAコマンドレットを使用して、クライアント マシンの信頼されたルート証明機関ストアにインポートする必要があります。 .

このページには、それらをエクスポート/インポートしてリモート クライアント シナリオを有効にする方法の詳細が記載されています。

于 2013-03-15T20:49:22.503 に答える
2

分かりました。その場合、両側でウィンドウを使用しているため、OAuthTokenProvider は必要ありません。Windows トークン プロバイダーを使用できますが、次のことを確認してください。 - 渡す資格情報がサーバーに存在する必要があります。 - 資格情報にドメインまたはワークグループの情報を含めないでください。

次のように構成する必要があります (サンプルでは、​​接続文字列に構成ファイルを使用していると想定しています)。

TokenProvider localUserTokenProvider = WindowsTokenProvider.CreateWindowsTokenProvider(
            connBuilder.StsEndpoints,
            new System.Net.NetworkCredential (userName, password));

このページには、Service Bus サーバーを「オフライン」で操作する方法の詳細が記載されています。

于 2013-03-20T21:21:14.447 に答える
1

何が起こっているのか、少なくともある程度は理解できました....

Win8ボックス(dev)にログインしているのと同じ資格情報でW2k8サーバーにアクセスする必要があります。

次のようにパラメーターを送信しようとすると:

//namespaceManager.Settings.TokenProvider = TokenProvider.CreateOAuthTokenProvider(new Uri[] { new Uri("https://ServerName:9355") }, new NetworkCredential("ServerLocalUser", "ServerLocalUserPwd", "ServerName"));
//messageFactory.GetSettings().TokenProvider = TokenProvider.CreateOAuthTokenProvider(new Uri[] { new Uri("https://ServerName:9355") }, new NetworkCredential("ServerLocalUser", "ServerLocalPWD", "ServerName"));

それではうまくいきません。ログインした資格情報を送信し、ServerLocalUser/Pwd/Name の組み合わせを使用しない理由はありますか?

イベントログを調べたら出てきた…

于 2013-03-20T03:19:49.437 に答える
0

物事を機能させるために私がしたことは次のとおりです。

開発マシン (Win8/Studio2012) とサーバー (Win2k8R2) の両方で同じローカル ユーザー アカウントの作成を開始しました。上記で参照されているクライアント証明書をエクスポートし (実際には 2 ~ 3 回)、必要に応じてインポートしました。良好な接続が機能するようになると、物事を後退させ始めました。Win8ボックスなどのローカルアカウントを削除すると、すべてが魔法のように機能し始めました。

私の環境についていくつか。これらすべてを VMWare Fusion で行っています。(そうフュージョン)。VM マシンはすべてネットワーク上で NAT を使用して構成されており、静的 IP は使用されていません。

方法はわかりませんが、機能しています。私は最初にメッセージだけをしました。メッセージを機能させることができれば、Pub/Sub トピックを追跡できます... 次はそれです。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Messaging;
    using System.Net;
    using System.Security.Cryptography.X509Certificates;
    using System.Net.Security;
    using System.Diagnostics;
    using System.Security;

    namespace Test_Service_Bus
    {
        public static class Util
        {

            public static void SetCertificatePolicy()
            {
                ServicePointManager.ServerCertificateValidationCallback += RemoteCertificateValidate;
            }

            private static bool RemoteCertificateValidate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
            {
                System.Console.WriteLine("Warning, trust any certificate");
                return true;
            }
        }

        class Program
        {

            static string ServerFQDN = "SVRNICK"; //System.Net.Dns.GetHostEntry(string.Empty).HostName;
            static int HttpPort = 9355;
            static int TcpPort = 9354;
            static string ServiceNameSpace = "ServiceBusDefaultNamespace";
            const string QueueName = "ServiceBusQueueSample";

            static void Main(string[] args)
            {
                SDKVersion();

            }


            static void SDKVersion()
            {

                ServiceBusConnectionStringBuilder connBuilder = new ServiceBusConnectionStringBuilder();
                connBuilder.ManagementPort = HttpPort;
                connBuilder.RuntimePort = TcpPort;

                connBuilder.Endpoints.Add(new UriBuilder() { Scheme = "sb", Host = ServerFQDN, Path = ServiceNameSpace }.Uri);
                connBuilder.StsEndpoints.Add(new UriBuilder() { Scheme = "https", Host = ServerFQDN, Port = HttpPort, Path = ServiceNameSpace }.Uri);

                TokenProvider localUserTokenProvider = WindowsTokenProvider.CreateWindowsTokenProvider(connBuilder.StsEndpoints, new System.Net.NetworkCredential("ServerLocalAcct", "ServerLocalPassword"));

                MessagingFactory messageFactory = MessagingFactory.Create(connBuilder.GetAbsoluteRuntimeEndpoints(), localUserTokenProvider);
                NamespaceManager namespaceManager = new NamespaceManager(connBuilder.GetAbsoluteManagementEndpoints(), localUserTokenProvider);

                NamespaceManager.CreateFromConnectionString(connBuilder.ToString());


                if (namespaceManager == null)
                {
                    Console.WriteLine("\nUnexpected error: NamespaceManager is NULL");
                    return;
                }

                Console.WriteLine("Checking if queue exists");
                if (namespaceManager.QueueExists(QueueName))
                {
                    Console.WriteLine("Queue exists, let's delete it so we can start over again");
                    namespaceManager.DeleteQueue(QueueName);
                }

                Console.WriteLine("And create a new queue");
                namespaceManager.CreateQueue(QueueName);



                // create a message client
                QueueClient myQueueClient = messageFactory.CreateQueueClient(QueueName);

                Console.WriteLine("Feeding messages");
                for (int i = 0; i < 1000; i++)
                {
                    if (i % 100 == 0)
                        Console.WriteLine("Messages sent: {0}", i.ToString());

                    // send to message broker
                    using (BrokeredMessage sendMessage = new BrokeredMessage("Hello world. " + i.ToString()))
                    {
                        sendMessage.Label = "Label_" + i.ToString(); ;
                        myQueueClient.Send(sendMessage);
                    }


                }

                BrokeredMessage receivedMessage = myQueueClient.Receive(TimeSpan.FromSeconds(5));

                while (receivedMessage != null)
                {
                    Console.WriteLine(string.Format("Message Received: Body={0}", receivedMessage.GetBody<string>()));
                    receivedMessage.Complete();

                    receivedMessage = myQueueClient.Receive(TimeSpan.FromSeconds(5));
                }

                // Close things down.
                Console.WriteLine("Closing down message");
                if (messageFactory != null)
                {
                    messageFactory.Close();
                }
            }
        }
    }
于 2013-03-22T01:52:10.473 に答える