none
Problème pour créer et tester l'existence d'une queue sur un serveur distant RRS feed

  • Discussion générale

  • Bonjour,

    Je viens de me lancer avec MSMQ et le C#.

    En local cela fonctionne très bien mais une fois que j'attaque un serveur distant je rencontre deux problèmes, j'ai regardé un peu partout sur le net mais je n'ai rien trouvé.

    Je n'arrive pas a créer une queue à distance alors que en local oui:

    MessageQueue rmQ = new MessageQueue

    L'envoie d'un message fonctionne à condition que je crée moi même la queue manuellement sur le serveur:

    MessageQueue rmQ = new MessageQueue

    ("FormatName:DIRECT=OS:brrdss05\\private$\\test"); rmQ.Send("Haaaa")


    Mais la création d'une queue en code sur le même serveur ne fonctionne pas

    J'ai essayé différentes instructions 

    MessageQueue.Create("FormatName:DIRECT=OS:brrdss05\\private$\\test2", true);

    Ou

    MessageQueue.Create("brrdss05\\private$\\test2", true);

    MessageQueue.Create("\\\\brrdss05\\private$\\test2", true);


    Même chose pour le teste d'une queue si elle existe:

                if (MessageQueue.Exists("FormatName:DIRECT=OS:brrdss05\\private$\\test"))
                    Console.WriteLine("ok");
                else
                    Console.WriteLine("pasok");
    
                Console.ReadLine();

    {"Impossible de déterminer si une file d'attente avec le nom de format spécifié existe."}

    Avez-vous une solution ou une expérience à ce sujet ?

    D'avance merci 

    vendredi 16 octobre 2015 15:21

Toutes les réponses

  • Bonjour,

    Les méthodes Create et Exists ne peuvent pas être utilisées pour atteindre une machine distante (cfr documentation)  Une solution, plutôt qu'accéder à la queue privée directement depuis le client, serait de mettre votre queue derrière un web service (WCF) qui lui, dans son implémentation, peut alors vérifier si la queue existe et si ce n'est pas le cas, si vous le souhaitez, renvoyer une erreur au client. (évitez quand même de donner trop d'informations techniques dans la réponse à votre client, best practice)

    samedi 17 octobre 2015 06:26
  • Merci j'ai également ce que j'ai découvert sur le net, je vais donc regarder du côté WCF
    • Modifié neotof samedi 17 octobre 2015 20:43
    samedi 17 octobre 2015 20:37
  • Bonjour V Hellin,

    Je viens donc de faire mon premier WCF avec msmq mais je rencontre un problème, tu pourras peut-être m'aider:

     IMSMQService.cs:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace MSMQNService
    {
        // REMARQUE : vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom d'interface "IService1" à la fois dans le code et le fichier de configuration.
        [ServiceContract]
        public interface IMSMQService
        {
            [OperationContract(IsOneWay = true)]
            void ShowMessage(string msg);
    
            // TODO: ajoutez vos opérations de service ici
        }
    
        // Utilisez un contrat de données (comme illustré dans l'exemple ci-dessous) pour ajouter des types composites aux opérations de service.
        // Vous pouvez ajouter des fichiers XSD au projet. Une fois le projet généré, vous pouvez utiliser directement les types de données qui y sont définis, avec l'espace de noms "MSMQNService.ContractType".
       
    }

    MSMQService.cs:

    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace MSMQNService
    {
        // REMARQUE : vous pouvez utiliser la commande Renommer du menu Refactoriser pour changer le nom de classe "Service1" à la fois dans le code et le fichier de configuration.
        public class MSMQService : IMSMQService
        {
            public void ShowMessage(string msg)
            {
                Debug.WriteLine(msg + " Received at: " + System.DateTime.Now.ToString());
            }
        }
    }

    WebConfig:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <system.web>
        <compilation debug="true" />
    	<customErrors mode="Off"/>
      </system.web>
      <system.serviceModel>
        <services>
          <service name="MSMQNService.MSMQService">
            <host>
              <baseAddresses>
                <add baseAddress="http://dev01-pc:8080/MSMQService/MSMQNService/"/>
              </baseAddresses>
            </host>
            <endpoint address="net.msmq://dev01-pc/private/myqueuetest"
                      binding="netMsmqBinding" bindingConfiguration="MyBinding"
                      contract="MSMQNService.IMSMQService">
              <identity>
                <dns value="dev01-pc" />
              </identity>
            </endpoint>
            <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior>
              <serviceMetadata httpGetEnabled="True" />
              <serviceDebug includeExceptionDetailInFaults="False" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
        <bindings>
          <netMsmqBinding>
            <binding name="MyBinding"  >
              <security mode="None"/>
            </binding>
          </netMsmqBinding>
        </bindings>
      </system.serviceModel>
    </configuration>

    Mon message d'erreur:

    Le protocole 'net.msmq' n'est pas pris en charge.

    Description : Une exception non gérée s'est produite au moment de l'exécution de la requête Web actuelle. Contrôlez la trace de la pile pour plus d'informations sur l'erreur et son origine dans le code. 

    Détails de l'exception: System.InvalidOperationException: Le protocole 'net.msmq' n'est pas pris en charge.

    Erreur source: 
    Une exception non gérée s'est produite lors de l'exécution de la requête Web actuelle. Les informations relatives à l'origine et l'emplacement de l'exception peuvent être identifiées en utilisant la trace de la pile d'exception ci-dessous.

    Trace de la pile: 
    [InvalidOperationException: Le protocole 'net.msmq' n'est pas pris en charge.]
       System.ServiceModel.Activation.HostedTransportConfigurationManager.InternalGetConfiguration(String scheme) +191176
       System.ServiceModel.Activation.HostedAspNetEnvironment.GetBaseUri(String transportScheme, Uri listenUri) +34
       System.ServiceModel.Channels.TransportChannelListener.OnOpening() +17220477
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +570
       System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +375
    
    [InvalidOperationException: Le ChannelDispatcher à 'net.msmq://dev01-pc/private/myqueuetest' avec le ou les contrats '"IMSMQService"' ne peut pas ouvrir son IChannelListener.]
       System.ServiceModel.Dispatcher.ChannelDispatcher.OnOpen(TimeSpan timeout) +17221661
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +742
       System.ServiceModel.ServiceHostBase.OnOpen(TimeSpan timeout) +260
       System.ServiceModel.Channels.CommunicationObject.Open(TimeSpan timeout) +742
       System.ServiceModel.HostingManager.ActivateService(ServiceActivationInfo serviceActivationInfo, EventTraceActivity eventTraceActivity) +126
       System.ServiceModel.HostingManager.EnsureServiceAvailable(String normalizedVirtualPath, EventTraceActivity eventTraceActivity) +901
    
    [ServiceActivationException: Le service '/MSMQService/MSMQNService.MSMQService.svc' ne peut pas être activé en raison d'une exception lors de la compilation. Le message de l'exception est : Le ChannelDispatcher à 'net.msmq://dev01-pc/private/myqueuetest' avec le ou les contrats '"IMSMQService"' ne peut pas ouvrir son IChannelListener..]
       System.Runtime.AsyncResult.End(IAsyncResult result) +645172
       System.ServiceModel.Activation.HostedHttpRequestAsyncResult.End(IAsyncResult result) +210877
       System.Web.AsyncEventExecutionStep.OnAsyncEventCompletion(IAsyncResult ar) +166

    Je pense que mon problème vient de mon fichier webConfig, as tu déjà rencontré ce type de problème ??

    D'avance merci 


    lundi 19 octobre 2015 10:33
  • Je pense plutôt que le problème est que le protocol Net.Msmq n'est pas activé. Dans IIS, tu dois aller dans les "advanced settings..." en sélectionner le site et ensuite l'option apparaît dans la partie droite. Une fois la fenêtre de dialogue "Advanced Settings" ouverte, sous le point Behavior > Enabled protocols, il faut rajouter net.msmq (séparé de http par une virgule)
    lundi 19 octobre 2015 15:44
  • Bonjour,

    J'ai déjà activé cette option dans comportement: protocoles activés: net.msmq,http et ça ne change rien.

    Bàv

    lundi 19 octobre 2015 18:14