visual studio publicar c# wcf iis msmq

c# - studio - WCF en IIS, utilizando MSMQ en modo de grupo de trabajo



wcf iis windows 10 (4)

He estado probando MSMQ con WCF, pero parece que no puedo hacer que funcione correctamente. Tengo el cliente (que envía mensajes a la cola) trabajando, usando WCF y una referencia de servicio. El código que hace esto es más o menos esto:

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

Donde MsmqContractClient es un proxy generado por Visual Studio cuando agrego una referencia de servicio. El punto final en la aplicación.config está apuntando a un msmqueue:

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

Esto funciona, los mensajes se publican en la cola.

Ahora intento que el servicio funcione, pero sigo recibiendo este error:

La validación de enlace falló porque la propiedad MsmqAuthenticationMode del enlace está establecida en WindowsDomain pero MSMQ está instalado con la integración de Active Directory deshabilitada. La fábrica de canales o el host del servicio no se pueden abrir.

Las cosas que he intentado son:

  • dar a todos acceso total (incluido el inicio de sesión anónimo) a la cola

  • configurar la aplicación para usar un enlace específico desde el archivo de configuración usando:

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

  • Intenté ejecutar el grupo de aplicaciones en IIS (7) con mi cuenta y mi cuenta de administrador

Lo que me detiene es que sigue tratando de convencerme de que estoy tratando de ejecutarlo con la autenticación de WindowsDomain. Dije que NO QUERÍA hacer eso con el modo de seguridad establecido en ninguno, ¿verdad?

Mi aplicación en este momento es simplemente un sitio asp.net de webforms con un servicio WCF agregado.

Si alguien podría al menos apuntarme en la dirección correcta, estaré muy agradecido, ya que ya he dedicado demasiado tiempo a esto.

Parece que la configuración se ignora o se ignora. El mensaje de error completo:

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

Traté de descifrar qué ocurre con Reflector, pero parece que de alguna manera se pasa un MsmqTransportBindingElement al proceso de creación de canal, que está convencido de que debe usar WindowsDomain como medida de seguridad. Sin embargo, tengo la seguridad establecida en ninguno en mi archivo de configuración. ¿Alguna idea de dónde viene este comportamiento de anulación?

Resolución:

Me siento realmente estúpido por un lado, pero siento que hay margen de mejora, por otro lado. La versión corta es que arruiné el valor en el atributo ''nombre'' en el elemento de servicio:

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

El nombre era el mismo que en mi cliente, sin embargo, el cliente tenía enlaces generados por Visual Studio. Le di un nombre diferente (MsmqService), por lo que el valor del nombre era ''MsmqService.MsmqService''.

Lo que me molesta es que no recibí ninguna advertencia de que estaba configurando un servicio no existente, o cualquier indicación de que estoy usando la configuración predeterminada para el servicio. Sería realmente bueno si el framework generara al menos una advertencia en algún lugar que estoy usando valores predeterminados, o una opción para activar alguna forma de modo estricto. De cualquier manera, gracias por todas sus aportaciones, y voy a golpear mi cabeza contra la pared unas cuantas veces más.

Y sí, ahora puedes señalar y reír ;-)


Cuando nos enfrentamos al problema <security mode="None"> funcionó en el entorno de prueba.

Durante la entrega final, incluso eso no funcionó ... Finalmente, este funcionó

<security> <transport msmqAuthenticationMode="None" msmqProtectionLevel="None"/> </security>


No estoy seguro de si esto resolverá su problema concreto aquí, pero hay una muy buena serie de publicaciones de blogs en tres partes de Tom Hollander:

Además, dado que el asunto de Active Directory parece ser el problema, ¿ha intentado decirle a su encuadernación MSMQ que no use AD?

<bindings> <netMsmqBinding> <binding name="MsmqBindingNonTransactionalNoSecurity" deadLetterQueue="Custom" exactlyOnce="false" useActiveDirectory="false"> <== try this setting here! <security mode="None" /> </binding> </netMsmqBinding> </bindings>


Dennis van der Stelt proporciona una buena muestra en WCF + MSMQ.

También le puede interesar este Q / A en MSDN :

P: Cuando ejecuto el ejemplo que usa un enlace predeterminado en el modo de grupo de trabajo, parece que los mensajes se envían pero el receptor nunca los recibe.

R: Por defecto, los mensajes se firman usando un certificado interno de MSMQ que requiere el servicio de directorio de Active Directory. En modo de grupo de trabajo, dado que Active Directory no está disponible, la firma del mensaje falla. Por lo tanto, el mensaje aparece en la cola de mensajes no entregados y se indica la causa de la falla, como "Firma incorrecta".

La solución alternativa es desactivar la seguridad. Esto se hace configurando Mode = None para que funcione en modo de grupo de trabajo.

Otra solución consiste en obtener MsmqTransportSecurity de la propiedad Transporte y configurarlo en Certificado, y configurar el certificado del cliente.

Otra solución alternativa es instalar MSMQ con integración de Active Directory.


Pruebe estas configuraciones ... useActiveDirectory debe ser falso por defecto, pero pruébelo. El modo de autenticación se establece en el transporte en sí, por lo que msmqAuthenticationMode debe establecerse en ''none''. msmqProtectionLevel y clientCredentialType suenan relevantes, así que también los lancé allí
:)


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

Sin embargo, me preocuparía eliminar toda la seguridad ... si está en un dominio, debe instalar MSMQ con la integración de Active Directory o utilizar los métodos de grupo de trabajo para proteger los mensajes.

Además, no olvide, las configuraciones para el servidor y el cliente deben coincidir.

HTH,
James

Perdón por las actualizaciones continuas, mi atención a los detalles parece ser un poco baja hoy
: PAG