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 при добавлении ссылки на службу. Конечная точка в приложении.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 устанавливается с активным Интеграция каталогов отключена. Этот фабрика каналов или узел обслуживания не могут быть открыт.
вещи, которые я пробовал:
дайте всем полный доступ (включая анонимный вход) в очередь
-
настройка приложения для использования определенной привязки из файла конфигурации с помощью:
<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
Я попытался выяснить, что происходит с помощью рефлектора, но просто кажется, что как-то MsmqTransportBindingElement передается в процесс построения канала, который убежден, что он должен использовать WindowsDomain в качестве меры безопасности. Однако, я безопасности не в мой конфигурационный файл. Есть идеи, откуда берется такое поведение?
4 ответов
попробуй эти настройки... useActiveDirectory
по умолчанию должно быть false, но попробуйте. Режим аутентификации установлен на самом транспорте, поэтому msmqAuthenticationMode
должно быть установлено значение 'none'. msmqProtectionLevel
и clientCredentialType
звучит уместно, поэтому я тоже бросил их туда
: )
<bindings>
<netMsmqBinding>
<binding name="MsmqBindingNonTransactionalNoSecurity"
deadLetterQueue="Custom"
useActiveDirectory="false"
exactlyOnce="false">
<security mode="None">
<transport
msmqAuthenticationMode="None"
msmqProtectionLevel="None"
clientCredentialType="None"/>
</security>
</binding>
</netMsmqBinding>
</bindings>
Я был бы обеспокоен удалением всей безопасности, однако... если вы находитесь в домене, вы должны установить MSMQ с интеграцией Active Directory или использовать методы рабочей группы для защиты сообщения.
кроме того, не забывайте, настройки для сервера и клиента должны совпадать.
HTH,
Джеймс!--7-->
извините за постоянные обновления, мое внимание к деталям, кажется, немного низко сегодня
: P
Не уверен, что это решит вашу конкретную проблему здесь, но есть действительно хорошая серия из трех частей блога Тома Холландера:
- MSMQ, WCF и IIS: заставить их играть хорошо (Часть 1 из 3)
- MSMQ, WCF и IIS: заставить их играть хорошо (Часть 2 из 3)
- MSMQ, WCF и IIS: заставить их играть хорошо (Часть 3 из 3)
также, так как материал Active Directory кажется, проблема в том, что вы пытались сказать привязке MSMQ не использовать AD ??
<bindings>
<netMsmqBinding>
<binding name="MsmqBindingNonTransactionalNoSecurity"
deadLetterQueue="Custom" exactlyOnce="false"
useActiveDirectory="false"> <== try this setting here!
<security mode="None" />
</binding>
</netMsmqBinding>
</bindings>
когда мы столкнулись с проблемой
<security mode="None">
работала в тестовой среде.
во время окончательной доставки , даже это не сработало.. Наконец, это сработало
<security>
<transport
msmqAuthenticationMode="None"
msmqProtectionLevel="None"/>
</security>
Деннис ван дер Стелт обеспечьте хороший образец на WCF + MSMQ.
вы также можете быть заинтересованы в этом Q / A on MSDN:
Q: когда я запускаю пример, который использует привязку по умолчанию в режиме рабочей группы, сообщения отправляются, но не доходят до получателя.
A: по умолчанию сообщения подписываются с помощью внутреннего сертификата MSMQ, для которого требуется служба каталогов Active Directory. В режиме рабочей группы , поскольку Active Directory недоступен, подписание сообщения завершается ошибкой. Таким образом, сообщение попадает в очередь мертвых букв, и указывается причина сбоя, такая как "плохая подпись".
обходной путь - отключить безопасность. Это делается путем установки Mode = None, чтобы заставить его работать в режиме рабочей группы.
другой обходной путь-получить MsmqTransportSecurity из свойства Transport и установить его в сертификат, а также установить сертификат клиента.
еще другим обходным путем является установка MSMQ с интеграцией Active Directory.