То, как я использую это сейчас, в основном отправляет что-то на сервер. Эта часть работает нормально, сообщения попадают в очередь (а не в пустую).

бовал 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 Directory. Фабрика канала или сервисный хост не могут быть открыты.

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

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

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

<bindings>
  <netMsmqBinding>
     <binding name="MsmqBindingNonTransactionalNoSecurity" 
              deadLetterQueue="Custom" 
              exactlyOnce="false">
       <security mode="None" />
     </binding>
  </netMsmqBinding>
</bindings>

Я попытался запустить пул приложений в IIS (7) под своей учетной записью и учетной записью администратора.

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

Мое приложение на данный момент - просто сайт webforms asp.net с добавленной к нему службой 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 в элементе service:

<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».

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

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

Ответы на вопрос(0)

Ваш ответ на вопрос