BOGUE : un client qui est lié le proxy Soapsuds DLL génère une exception d'accès à distance lors de l'exécution

Traductions disponibles Traductions disponibles
Numéro d'article: 828987 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Symptômes

Lorsqu'un client est lié avec le proxy DLL qui génère l'outil Soapsuds (Soapsuds.exe), le client lève une exception à distance au moment de l'exécution. Vous pouvez recevoir un message d'erreur est similaire à la message d'erreur suivantes :
Exception non gérée : System.Runtime.Remoting.RemotingException : Autorisation refusée pour l'activation de type soap : TestClass, http://schemas.microsoft.com/clr/nsassem/EchoExeTest/ServerExe%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull. Trace de pile serveur: à System.Runtime.Remoting.Activation.ActivationListener.Activate(IConstructionCallMessage ctorMsg) à System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) à System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

Contournement

Pour contourner ce problème en liant le client, procédez comme suit :
  1. Exécuter l'application serveur d'accès à distance et ensuite générer le proxy à l'aide de la commande suivante :
    soapsuds -url:<ServerUrl?wsdl> -oa:serverexe.dll
  2. Exécuter le serveur d'accès distant.
    1. Générer le code proxy à l'aide de la commande suivante :
      soapsuds -url:<ServerUrl?wsdl> -gc
    2. Ouvrez le fichier .cs qui génère de Soapsuds.exe, supprimez l'attribut SoapType à partir de la classe et puis générez le proxy.
    3. Lier le proxy vers le client et réexécutez Soapsuds.exe.

      note Si le serveur d'accès distant ne s'exécute pas, Soapsuds.exe génère une erreur et ne génère pas le code proxy.

Statut

Microsoft a confirmé qu'il s'agit un bogue dans les produits Microsoft répertoriés au début de cet article.

Plus d'informations

Procédure pour reproduire le problème

  1. Utilisez le Bloc-notes pour créer un fichier texte. Collez le code suivant dans le fichier :
    <configuration>
      <system.runtime.remoting>
        <application name="ServerExe">
        
          <channels>
            <channel port="9998" type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting,Version=1.0.5000.00, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
              <serverProviders>
                   <provider ref="wsdl" metadataEnabled="true" remoteApplicationMetadataEnabled="true" />
                   <formatter ref="soap" typeFilterLevel="Full" />
                   <formatter ref="binary" typeFilterLevel="Low" />
              </serverProviders>
            </channel>
            <channel port="9999" type="System.Runtime.Remoting.Channels.Tcp.TcpChannel, System.Runtime.Remoting,Version=1.0.5000.00, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          </channels>
       </application>
      </system.runtime.remoting>
    </configuration>
  2. Enregistrez le fichier en tant que C:\ServerChannels.config .
  3. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Collez le code suivant dans le fichier :
    <configuration>
      <system.runtime.remoting>
        <application>
    
          <service>
            <activated type="EchoExeTest.TestClass, ServerExe" />
          </service>
    
        </application>
      </system.runtime.remoting>
    </configuration>
    
  4. Enregistrez le fichier en tant que C:\ServerCao.cfg .
  5. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Paste the following code in the file:
    using System;
    using System.Runtime.Remoting;
    using System.Runtime.Remoting.Metadata;
    using System.Runtime.Remoting.Metadata.W3cXsd2001;
    
    namespace EchoExeTest{
        [Serializable]
        public class testObject 
        {
            public int x;
            public int y;
        }
        [Serializable]
        public struct testStruct
        {
            public int x;
            public int y;
        }
        public class Server {
    
            public static int Main(string [] args) {
        
                Server servObj = new Server();
                servObj.Initialize(args);
                System.Console.WriteLine("Press ENTER to exit.");
                System.Console.ReadLine();
                return 0;
            }
    
            public void Usage() {
                Console.WriteLine(" Usage : ServerExe -chan:channel.config -mode:mode.config");
            }
    
            public  int Initialize(string[] args) {
                int ret=0;  
    
                if (args.Length == 0) 
                    Usage();
                for (int i=0;i<args.Length;i++) {
                    if (
                        String.Compare(args[i],"HELP", true) == 0 ||
                        String.Compare(args[i],"?", true) == 0 ||
                        String.Compare(args[i],"/h", true) == 0 ||
                        String.Compare(args[i],"-h", true) == 0 ||
                        String.Compare(args[i],"-?", true) == 0 ||
                        String.Compare(args[i],"/?", true) == 0
                    ) {
                        Usage();
                        return -1;
                    }
    
    
                    String arg = args[i];   
                    String value = null;
    
                    if (args[i][0] == '/' || args[i][0] == '-'){   
                        int index = args[i].IndexOf(':');
                        if (index != -1) {
    
                            arg = args[i].Substring(1, index-1);
                                //Make sure that a colon (:) is not the last character.
                            if (index == (args[i].Length - 1))
                                throw new Exception("Argument cannot be empty -> " + args[i]);
                            value = args[i].Substring(index+1);
                        }
                        else        
                            arg = args[i].Substring(1);     
                    }
    
                    //Process the input sources.
                    if (String.Compare(arg, "chan", true) == 0) {
                        RemotingConfiguration.Configure(value);
                    }
                    else if (String.Compare(arg, "mode", true) == 0) {
                        RemotingConfiguration.Configure(value);
                    }   
                }   
                ret=100;
                return ret;
            }
    
        }
    
        
        public class TestClass : MarshalByRefObject {
        
            public int EchoInt(int intval) {    
                Console.WriteLine("Method Called");
                return intval;
            }     
            public string EchoString(string strval) {    
                Console.WriteLine("Method Called");    
                return strval;
            }
            public DateTime EchoDateTime(DateTime dval) {
                return dval;
            }
            public void voidFunc(){
                return;
            }
            public int EchoParam(int intval) {
                return intval;
            }
            public void SendParam(int intval) {
                return;
            }
            public int GetParam() {
                return 10;
            }
            public int EchoRefParam(ref int intval) {
                intval++;
                return 100;
            }
            public void SendRefParam(ref int intval) {
                intval++;
                return;
            }
            public void OutParam(out int intval) {
                intval=100;
            }   
            public testStruct echoStruct(testStruct ts) {
                return ts;
            }
            public testObject echoObject(testObject to) {
                Console.WriteLine("Method Called");
                return to;
            }
            public int[] echoArray(int[] intArray) {
                return intArray;
            }
            
        }
    
    }
    
  6. Enregistrez le fichier en tant que ServerExe.cs .
  7. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Collez le code suivant dans le fichier :
    <configuration>
      <system.runtime.remoting>
        <application name="ClientExe">
        
          <channels>
            <channel port="0" type="System.Runtime.Remoting.Channels.Http.HttpChannel, System.Runtime.Remoting,Version=1.0.5000.00, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
            <channel port="0" type="System.Runtime.Remoting.Channels.Tcp.TcpChannel, System.Runtime.Remoting,Version=1.0.5000.00, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
          </channels>
    
        </application>
      </system.runtime.remoting>
    </configuration>
  8. Enregistrez le fichier en tant que C:\ClientChannels.config .
  9. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Collez le code suivant dans le fichier :
    <configuration>
      <system.runtime.remoting>
        <application >
    
           <client url="http://localhost:9998/" >
            <activated type="EchoExeTest.TestClass, ServerExe" url="http://localhost:9998/TestClass.soap" />
           </client>
        </application>
      </system.runtime.remoting>
    </configuration>
  10. Enregistrez le fichier en tant que C:\HttpCaoClient.cfg .
  11. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Paste the following code in the file:
    using System;
    using System.Runtime.Remoting;
    using EchoExeTest;
    
    public class ClientExeClass
    {
        public static int Main(String[] args)
        {
            const int PASS = 0xABBA;
            int parint = 12, outInt;
            string parstring = "hello";
            DateTime pardatetime = DateTime.Now;
            testStruct tStruct = new testStruct();
            tStruct.x = 100 ; tStruct.y = 200;
            testObject tObject = new testObject();
            tObject.x = 100 ; tObject.y = 200;
    
            Console.WriteLine("Start initiating the object.");
            ClientExeClass cec = new ClientExeClass();
            cec.Initialize(args);
            TestClass tClass = new TestClass();
            if(tClass == null){
                Console.WriteLine("Object not activated.");
                return 0;
            }
    
            try{        
                Console.WriteLine("Calling methods on the object.");
                
                int retInt = tClass.EchoInt(parint);
                if(retInt != parint)
                    throw new Exception("Failure in EchoInt method.");
                
                String retString = tClass.EchoString(parstring);
                if(retString != parstring)
                    throw new Exception("Failure in EchoString method.");
    
                DateTime retDval = tClass.EchoDateTime(pardatetime);
                if(retDval != pardatetime)
                    throw new Exception("Failure in EchoDateTime method.");
    
                tClass.voidFunc();
                tClass.SendParam(parint);
                retInt = tClass.GetParam();
                if(retInt != 10)
                    throw new Exception("Failure in GetParam method.");
    
                tClass.SendRefParam(ref parint);
                if(parint != 13)
                    throw new Exception("Failure in SendRefParam method.");
    
                retInt = tClass.EchoRefParam( ref parint);
                if((retInt != 100) || (parint != 14))
                    throw new Exception("Failure in EchoRefParam method.");
    
                tClass.OutParam(out outInt);
                if(outInt != 100)
                    throw new Exception("Failure in OutParam method.");
    
                testStruct retStruct = tClass.echoStruct(tStruct);
                if( (retStruct.x != tStruct.x) ||
                    (retStruct.y != tStruct.y))
                    throw new Exception("Failure in echoStruct method.");
    
                testObject retObject = tClass.echoObject(tObject);
                if( (retObject.x != tObject.x) ||
                    (retObject.y != tObject.y))
                    throw new Exception("Failure in echoObject method.");
    
                int[] parArray = new int[2];
                parArray[0]=1;
                parArray[1]=2;
    
                int[] retArray = tClass.echoArray(parArray);
                if( (retArray[0] != parArray[0]) ||
                    (retArray[1] != parArray[1]))
                    throw new Exception("Failure in echoArray method.");             
    
            }catch (Exception e) {
                Console.WriteLine(e);
                return 0;
            }
    
            return PASS;
        }
        
        public void Usage() {
            Console.WriteLine(" Usage : ClientExe -chan:Client.config -mode:wko/cao?client.config");
        }
    
        public  void Initialize(string[] args) {
            int ret=0;  
    
            if (args.Length == 0) 
            Usage();
            for (int i=0;i<args.Length;i++) {
            if (
                String.Compare(args[i],"HELP", true) == 0 ||
                String.Compare(args[i],"?", true) == 0 ||
                String.Compare(args[i],"/h", true) == 0 ||
                String.Compare(args[i],"-h", true) == 0 ||
                String.Compare(args[i],"-?", true) == 0 ||
                String.Compare(args[i],"/?", true) == 0
            ) {
                Usage();
                return;
            }
    
    
                String arg = args[i];   
            String value = null;
    
            if (args[i][0] == '/' || args[i][0] == '-'){   
                int index = args[i].IndexOf(':');
                if (index != -1) {
    
                arg = args[i].Substring(1, index-1);
                    //Make sure that a colon (:) is not the last character.
                if (index == (args[i].Length - 1))
                    throw new Exception("Argument cannot be empty. -> " + args[i]);
                value = args[i].Substring(index+1);
                }
                else    
                arg = args[i].Substring(1); 
            }
    
            //Process the input sources.
            if (String.Compare(arg, "chan", true) == 0) {
                Console.WriteLine(value);
                RemotingConfiguration.Configure(value);
                    }
            else if (String.Compare(arg, "mode", true) == 0) {
                Console.WriteLine(value);
                RemotingConfiguration.Configure(value);
            }   
            }   
            return;
        }
    
    }
    
  12. Enregistrez le fichier en tant que C:\ClientExe.cs .
  13. Utilisez le Bloc-notes pour créer un nouveau fichier texte. Collez le code suivant dans le fichier:
    csc ServerExe.cs
    start serverexe -chan:serverchannels.config -mode:servercao.cfg
    soapsuds -url:http://localhost:9998/remoteapplicationmetadata.rem?Wsdl -oa:serverexe.dll
    csc /r:serverexe.dll clientexe.cs
    clientexe -chan:clientchannels.config -mode:httpcaoclient.cfg
    
  14. Enregistrez le fichier en tant que c:\Build.bat .
  15. Pour Visual Studio .NET 2002, cliquez sur Démarrer pointez sur programmes , pointez sur Visual Studio .NET , pointez sur Outils de Visual Studio .NET et puis cliquez sur invite de commande Visual Studio .NET pour.

    Pour Visual Studio .NET 2003, cliquez sur Démarrer , pointez sur programmes , pointez sur Visual Studio .NET 2003 , pointez sur Outils de Visual Studio .NET et puis cliquez sur invite de commande Visual Studio .NET 2003 .
  16. À l'invite de commandes, tapez C: et puis appuyez sur la touche ENTRÉE.
  17. Tapez Build.bat et puis appuyez sur la touche ENTRÉE.
  18. Exécuter l'application serveur accès distant et l'application client à distance.

    Vous pouvez recevoir le message d'erreur qui est mentionné dans la section « Symptômes » de cet article.

Références

Pour plus d'informations sur Soapsuds.exe, reportez-vous au site Web Microsoft Developer Network(MSDN) suivant :
http://msdn2.microsoft.com/en-us/library/xd176a6c(vs.71).aspx

Propriétés

Numéro d'article: 828987 - Dernière mise à jour: jeudi 19 avril 2007 - Version: 2.4
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft .NET Framework 1.1
Mots-clés : 
kbmt kbproxydev kbcominterop kbremoting kbbug KB828987 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique. Si vous relevez des erreurs graves et souhaitez contribuer à l?amélioration du système, vous pouvez compléter l?enquête à votre disposition dans le bas des articles.
La version anglaise de cet article est la suivante: 828987
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com