2016-08-29 2 views
0

Я недавно следил за this article о том, как настроить 3-стороннюю систему очередей с MSMQ, где издатель, сервер очереди и подписчик находятся на разных системах в пределах Домен Active Directory. Мне удалось заполнить Часть 1 и первую половину Части 2. Однако, когда я продолжу вторую половину Части 2 и включит Транспортную безопасность, я получаю следующую ошибку: An error occurred when converting the 'mymsmqservermachine.mydomain.network.ads\private$\Path/To/MyQueuedService.svc' queue path name to the format name: Unrecognized error -1072824300 (0xc00e0014). All operations on the queued channel failed. Ensure that the queue address is valid. MSMQ must be installed with Active Directory integration enabled and access to it is available.Как разрешить сбой преобразования имени при отправке сообщений MSMQ

Я проверил следующее :

  1. Интеграция Active Directory для MSMQ включена на всех компьютерах в трехсторонней системе на this StackOverflow post.
  2. URL-адрес очереди остается таким же, как и до обеспечения безопасности, который работал нормально, без каких-либо ошибок при анализе.
  3. Я выполняю инструкции, предоставляемые Windows при установке MSMQ here.

Соответствующие части трассировки стека я получаю:

at System.ServiceModel.Channels.MsmqFormatName.FromQueuePath(String queuePath) 
    at System.ServiceModel.Channels.MsmqUri.ActiveDirectory.UriToFormatName(Uri uri) 
    at System.ServiceModel.Channels.MsmqOutputChannel.OpenQueue() 
--- End of inner exception stack trace --- 

Server stack trace: 
    at System.ServiceModel.Channels.MsmqOutputChannel.OpenQueue() 
    at System.ServiceModel.Channels.MsmqOutputChannel.OnOpenCore(TimeSpan timeout) 
    at System.ServiceModel.Channels.MsmqOutputChannel.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult.InvokeOpen() 
    at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject, TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.CommunicationObject.BeginOpen(TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.ServiceChannel.OnBeginOpen(TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult.InvokeOpen() 
    at System.ServiceModel.Channels.CommunicationObject.OpenAsyncResult..ctor(CommunicationObject communicationObject, TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.CommunicationObject.BeginOpen(TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.ICallOnce.BeginCall(ServiceChannel channel, TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.ServiceChannel.CallOnceManager.BeginCallOnce(TimeSpan timeout, CallOnceManager cascade, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.ServiceChannel.BeginEnsureOpened(TimeSpan timeout, AsyncCallback callback, Object state) 
    at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.StartEnsureOpen(Boolean completedSynchronously) 
    at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.FinishEnsureInteractiveInit(IAsyncResult result, Boolean completedSynchronously) 
    at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.StartEnsureInteractiveInit() 
    at System.ServiceModel.Channels.ServiceChannel.SendAsyncResult.Begin() 
    at System.ServiceModel.Channels.ServiceChannel.BeginCall(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, TimeSpan timeout, AsyncCallback callback, Object asyncState) 
    at System.ServiceModel.Channels.ServiceChannel.BeginCall(ServiceChannel channel, ProxyOperationRuntime operation, Object[] ins, AsyncCallback callback, Object asyncState) 
    at System.Threading.Tasks.TaskFactory`1.FromAsyncImpl[TArg1,TArg2,TArg3](Func`6 beginMethod, Func`2 endFunction, Action`1 endAction, TArg1 arg1, TArg2 arg2, TArg3 arg3, Object state, TaskCreationOptions creationOptions) 
    at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.CreateTask(ServiceChannel channel, ProxyOperationRuntime operation, Object[] inputParameters) 
    at System.ServiceModel.Channels.ServiceChannelProxy.TaskCreator.CreateTask(ServiceChannel channel, IMethodCallMessage methodCall, ProxyOperationRuntime operation) 
    at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message) 
Exception rethrown at [0]: 
    at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 
    at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) 

Основываясь на содержании трассировки стека, оказывается, что отказ исходит от разрешения имени очереди в пределах Active Directory. Я попытался следующие попытки разрешить такой отказ:

  1. Упрощая имя не содержит никаких периодов или косой черты (не работает)
  2. с использованием общей очереди, а не частная очереди, в что этот шаг был опущен из оригинального учебника по MSDN (он не был, не работал)

На данный момент у меня нет идей. Кто-нибудь столкнулся с этой ошибкой при использовании WCF с привязками net.msmq до и решил проблему?

EDIT: При выполнении следующего тестового кода из одной и той же машине и тем же пользователем, я могу отправить сообщение в очередь прекрасно:

Me.TestContext.WriteLine("Executing under user '{0}'", WindowsIdentity.GetCurrent().Name) 

Dim msg = New System.Messaging.Message() 

msg.Body = "This is a test message" 
msg.Label = "Test Message" 
msg.Formatter = new ActiveXMessageFormatter() 

Dim queue = new MessageQueue("FormatName:DIRECT=OS:mymsmqservermachine.mydomain.network.ads\private$\Path/To/MyQueuedService.svc") 

queue.Send(msg) 
+0

Вы говорите, что проблема возникает только при включении безопасности транспорта, так что это должна быть проблема аутентификации/сертификации, а не то, как вы называете эту очередь. Я понимаю, что 0xc00e0014 означает MQ_ERROR_ILLEGAL_QUEUE_PATHNAME, но это, вероятно, красная селедка. –

+0

Например, может возникнуть проблема синхронизации: https://blogs.msdn.microsoft.com/johnbreakwell/2008/11/18/make-sure-to-set-the-clocks-for-msmq/ –

+0

@JohnBreakwell Хорошо идея, я не считал это. Я только что исследовал, и моя машина находится в пределах 1 секунды от контроллера домена, они оба синхронизированы по сети. –

ответ

0

По чистой случайности, я наткнулся на решение , и I recorded it in my blog.

Суть решения в том, что я должен был добавить идентификатор DNS для моей WCF конечной точки привязки в моем клиенте:

Dim endpointAddress = New EndpointAddress(queueUri, EndpointIdentity.CreateDnsIdentity(queueUri.Host)) 

Dim netMsmqBinding = New NetMsmqBinding With 
{ 
    .Durable = true, 
    .ExactlyOnce = false, 
    .UseActiveDirectory = false, 
    .Security = New NetMsmqSecurity With 
    { 
     .Mode = NetMsmqSecurityMode.Transport 
    } 
} 

Return New ChannelFactory(Of ICwteCentralPublishingServiceChannel)(netMsmqBinding, endpointAddress) 

Я извиняюсь перед миром для базового кода на Visual это унаследованное приложение и не был моим выбором.

Смежные вопросы