WCF в IIS с использованием MSMQ в режиме рабочей группы

Я пробовал использовать MSMQ с WCF, но не могу заставить его работать должным образом. Я' Мы получили клиент (который отправляет сообщения в очередь) в рабочем состоянии, используя WCF и ссылку на службу. Код, который делает это, выглядит примерно так:

static void Main(string[] args)
{
    var client = new MsmqServiceReference.MsmqContractClient();
    client.SendMessage("TEST");
    client.Close();
    Console.ReadKey();
}

Где MsmqContractClient - это прокси, созданный Visual Studio, когда я добавляю ссылку на службу. Конечная точка в app.config указывает на msmqueue:

<client>
  <endpoint 
    address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
    binding="netMsmqBinding"  
    bindingConfiguration="MsmqBindingNonTransactionalNoSecurity"
    contract="MsmqServiceReference.IMsmqContract" name="MsmqService" />
</client>

Это работает, сообщения отправляются в очередь.

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

Проверка привязки не удалась, поскольку привязка MsmqAuthenticationMode свойство установлено в WindowsDomain, но MSMQ устанавливается с Active Интеграция каталогов отключена. В фабрика каналов или хост службы не могут

Вот что я пробовал:

  • предоставить всем полный доступ (включая анонимный вход) к очереди

  • , настраивая приложение для использования определенной привязки из файла конфигурации, используя:

     
     
     <имя привязки = "MsmqBindingNonTransactionalNoSecurity" 
     deadLetterQueue = "Пользовательский" 
     точноOnce = "ложь">
     
     
     
    
    
  • Я попытался запустить пул приложений в IIS (7) под своей учетной записью и учетной записью администратора.

Меня удивляет то, что он пытается убедить меня, что я пытаюсь запустить его с аутентификацией WindowsDomain. Я заявил, что НЕ хочу делать это, если для режима безопасности установлено значение none, верно?

Мое приложение на данный момент представляет собой просто сайт asp.net webforms с добавленной к нему службой WCF.

Если кто-то может хотя бы указать мне правильное направление. Я буду очень благодарен, так как я уже потратил на это слишком много времени.


Кажется, что конфигурация игнорируется или отменяется. Полное сообщение об ошибке:

WebHost failed to process a request.
 Sender Information: System.ServiceModel.Activation.HostedHttpRequestAsyncResult/63721755
 Exception: System.ServiceModel.ServiceActivationException: The service '/MsmqService/MsmqService.svc' cannot be activated due to an exception during compilation.  The exception message is: Binding validation failed because the binding's MsmqAuthenticationMode property is set to WindowsDomain but MSMQ is installed with Active Directory integration disabled. The channel factory or service host cannot be opened.. ---> System.InvalidOperationException: Binding validation failed because the binding's MsmqAuthenticationMode property is set to WindowsDomain but MSMQ is installed with Active Directory integration disabled. The channel factory or service host cannot be opened.
   at System.ServiceModel.Channels.MsmqVerifier.VerifySecurity(MsmqTransportSecurity security, Nullable`1 useActiveDirectory)
   at System.ServiceModel.Channels.MsmqVerifier.VerifyReceiver(MsmqReceiveParameters receiveParameters, Uri listenUri)
   at System.ServiceModel.Channels.MsmqTransportBindingElement.BuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
   at System.ServiceModel.Channels.MessageEncodingBindingElement.InternalBuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BinaryMessageEncodingBindingElement.BuildChannelListener[TChannel](BindingContext context)
   at System.ServiceModel.Channels.BindingContext.BuildInnerChannelListener[TChannel]()
   at System.ServiceModel.Channels.Binding.BuildChannelListener[TChannel](Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, BindingParameterCollection parameters)
   at System.ServiceModel.Description.DispatcherBuilder.MaybeCreateListener(Boolean actuallyCreate, Type[] supportedChannels, Binding binding, BindingParameterCollection parameters, Uri listenUriBaseAddress, String listenUriRelativeAddress, ListenUriMode listenUriMode, ServiceThrottle throttle, IChannelListener& result, Boolean supportContextSession)
   at System.ServiceModel.Description.DispatcherBuilder.BuildChannelListener(StuffPerListenUriInfo stuff, ServiceHostBase serviceHost, Uri listenUri, ListenUriMode listenUriMode, Boolean supportContextSession, IChannelListener& result)
   at System.ServiceModel.Description.DispatcherBuilder.InitializeServiceHost(ServiceDescription description, ServiceHostBase serviceHost)
   at System.ServiceModel.ServiceHostBase.InitializeRuntime()
   at System.ServiceModel.ServiceHostBase.OnBeginOpen()
   at System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout)
   at System.ServiceModel.Channels.CommunicationObject.Open()
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.ActivateService(String normalizedVirtualPath)
   at System.ServiceModel.ServiceHostingEnvironment.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath)
   --- End of inner exception stack trace ---
   at System.Runtime.AsyncResult.End[TAsyncResult](IAsyncResult result)
   at System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result)
 Process Name: w3wp
 Process ID: 5660

Я пытался выяснить, что происходит с помощью Reflector, но мне просто кажется, что каким-то образом MsmqTransportBindingElement передается в процесс построения канала, который убежден, что он должен использовать WindowsDomain в качестве меры безопасности. Однако в моем файле конфигурации для безопасности установлено значение none. Есть идеи относительно того, откуда взялось такое поведение переопределения?


Решение:

Я чувствую себя действительно глупо, с одной стороны, но я чувствую, что есть возможности для улучшения, с другой стороны. Вкратце, я испортил значение атрибута name в сервисном элементе:

<services>
  <service name="WcfService.MsmqService">
    <!--        <endpoint binding="mexHttpBinding" contract="IMetadataExchange" />-->
    <endpoint name="msmq" 
            address="net.msmq://localhost/private/MsmqService/MsmqService.svc"
            binding="netMsmqBinding" 
            bindingConfiguration="NoSecurity"
            contract="WcfService.IMsmqContract" />
  </service>
</services>

Имя было таким же, как и на моем клиенте, однако у клиента были привязки, сгенерированные Visual Studio. Я дал ему другое имя (MsmqService), поэтому значение имени было «MsmqService.MsmqService».

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

И да, теперь вы можете указывать пальцем и смеяться; -)

12
задан SteveC 21 May 2015 в 05:25
поделиться