Проблема активации wcf MSMQ с .net 4.0 и сервером 2008

У меня есть приложение .net 4.0, перенесенное из net 3.5, которое использует net.msmq на сервере 2008 x64

Настройка

  • net.msmq Служба с адресом "net.msmq://localhost/private/msmqdataservice.svc"
  • net.msmq endpoing с адресом "net.msmq://localhost/private/msmqdataservice.svc"
  • очередь в MSMQ → name = "$ private\msmqdataservice.svc"

все работает над производством прямо сейчас с .net 3.5.

Я установил .net 4.0 на сервер и создал новый сайт для размещения в одном окне.

Новая настройка msmq установки

  • net.msmq Служба с адресом "net.msmq://localhost/private/staging/msmqdataservice.svc"
  • net.msmq endpoing с адресом "net.msmq://localhost/private/staging/msmqdataservice.svc"
  • очередь в MSMQ → name = "$ private\staging/msmqdataservice.svc"

Создана другая очередь для другого сайта.

Другое изменение, которое я сделал с новым сайтом, это другой сайт в iis с прослушиванием на другом ip-адресе. Я оставил привязку net.msmq к "localhost". На главном сайте также есть привязка для net.msmq → 'localhost'. Я думаю, что так должно быть. Пожалуйста, укажите, нужна ли какая-то другая конфигурация.

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

В журнале нет никаких признаков чего-либо неправильного. Единственное, что я вижу в журнале, связанном с этим, - это предупреждение "msmqactivation не может обнаружить очередь". Хотя это предупреждение я никогда не понимал правильно, поскольку мы видели это всегда со всем прекрасным с msmq в 3.5.

Все, что я могу думать, проверяется, и это правильно.

  • Пул приложений приложений запущен как сетевой сервис и имеет полный доступ к очереди.
  • Служба активации net.msmq работает с сетевым сервисом
  • Пробовал другое соглашение об именах URL-адреса службы с таким же результатом

Резюме

Просьба представить информацию о настройке нескольких сайтов с помощью net.msmq. Я использую привязку net.msmq со значением = 'localhost' для обоих сайтов. Я думаю, что это механическое имя.

Любой способ диагностировать эту проблему?

Любая вещь, о которой вы можете подумать, может помочь.

Нам пришлось отложить выпуск вчера, так как, проведя 100 человеко-часов, мы не можем понять, в чем проблема. Также не удается заставить его разбиться на моей машине разработки.

Изменить

Проблема заключалась в том, что после создания нового соглашения об именах сайтов не работает, как

net.msmq Служба с адресом "net.msmq://localhost/private/staging/msmqdataservice.svc" net.msmq endpoing с адресом "net.msmq://localhost/private/staging/msmqdataservice.svc" очередь в MSMQ → name = "$ private\staging/msmqdataservice.svc"

он работал с именем службы net.msmq://localhost/private/msmqdataservice.svc

но теперь у меня не может быть двух сайтов, использующих точно такую ​​же конечную точку.

Любой способ иметь одну и ту же конечную точку на двух разных сайтах с разными URL-адресами и другой очереди на одной машине?

Ответ 1

Исправление для меня заключалось в установке AppFabric для Windows Server v1.1. (Должно быть для тех, кто использует WAS/IIS для размещения служб WCF или WF-приложений.)

Это также исправило проблему, с которой я столкнулся с сбоем процесса WAS каждый раз, когда я создал очередь, отличную от WCF. Отладчик "Just-In-Time" выбрал следующее:

 System.ServiceModel.EndpointNotFoundException was unhandled
      Message=The service '~/nonWcfQueueName' does not exist.
      Source=System.ServiceModel.Activation
      StackTrace:
           at System.ServiceModel.ServiceHostingEnvironment.NormalizeVirtualPath(String virtualPath)
           at System.ServiceModel.Channels.MsmqHostedTransportManager.HostedBindingFilter.MatchFound(String host, String name, Boolean isPrivate)
           at System.ServiceModel.Channels.MsmqBindingMonitor.MatchQueue(MatchState state)
           at System.ServiceModel.Channels.MsmqBindingMonitor.ProcessFoundQueues(MessageQueue[] queues, Dictionary`2 knownQueues, Boolean isPrivate)
           at System.ServiceModel.Channels.MsmqBindingMonitor.OnTimer(Object state)
           at System.Runtime.IOThreadScheduler.ScheduledOverlapped.IOCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
           at System.Runtime.Fx.IOCompletionThunk.UnhandledExceptionFrame(UInt32 error, UInt32 bytesRead, NativeOverlapped* nativeOverlapped)
           at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)
      InnerException: 

Я думаю, что многим людям не нужно смешивать очереди WCF/non-WCF на одной машине. Надеюсь, это спасет кого-то от боли, которую я пережил на прошлой неделе!

Ответ 2

Как использовать другой порт? Вы можете использовать одно и то же имя хоста и сообщить WAS для активации на новом порту в новом vdir или сайте.

Ответ 3

К сожалению, слушатель использует имя службы для определения очереди для прослушивания, поэтому, если ваша служба приема называется

MYOrganisation.Services.MyService.svc

ваша очередь должна быть вызвана

net.msmq://localhost/MYOrganisation.Services/MyService.svc

Итак, очередь вызывается:

MYOrganisation.Services/MyService.svc

Попробуй это и вернись ко мне. Я могу опубликовать полный пример конфигурации, которая работает.

Мне кажется, что даже если у вас может не быть двух разных конечных точек, вы можете иметь одну и ту же услугу с другим пространством имен (или просто переименовать службу), слушая другую очередь. Не идеально, но это единственное, что я нашел, что сработает.

Ответ 4

URI конечной точки службы должен соответствовать (более или менее, cf http://msdn.microsoft.com/en-us/library/ms789042.aspx) имя очереди. Таким образом, решение будет состоять в создании виртуального каталога с именем staging и размещении вашего сервиса там.

Что касается информации привязки, localhost указывает на сервер, то слушатель очереди должен быть прослушиванием, поэтому, если ваши очереди установлены на том же компьютере, что и IIS, это действительно является локальным хостом.

Ответ 5

Также интересный момент: служба адаптера net.msmq listner, похоже, кэширует тот факт, что не может получить доступ к очереди. Если он пытается получить доступ к очереди для вашей службы и терпит неудачу, а затем вы добавите разрешение для адаптера прослушивателя net.msmq, он все равно не будет работать. Я перезапустил службу, а затем снова зашла очередь.