BUG: Un client che è collegato con il proxy di Soapsuds DLL genera un'eccezione di Remoting in fase di esecuzione

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 828987
Questo articolo è stato archiviato. L’articolo, quindi, viene offerto “così come è” e non verrà più aggiornato.
Sintomi
Quando un client è collegato con la DLL che genera lo strumento Soapsuds (Soapsuds.exe) proxy, il client genera un'eccezione remota in fase di esecuzione. È possibile messaggio di errore analogo al seguente messaggio di errore:
Eccezione non gestita: System.Runtime.Remoting.RemotingException: autorizzazione negata per l'attivazione ClasseProva: tipo soap, http://schemas.microsoft.com/clr/nsassem/EchoExeTest/ServerExe%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull. Analisi dello stack del server: in System.Runtime.Remoting.Activation.ActivationListener.Activate(IConstructionCallMessage ctorMsg) in System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) in System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)
Workaround
Per aggirare il problema collegando il client, attenersi alla seguente procedura:
  1. Esegue l'applicazione server remoto e quindi generare il proxy utilizzando il comando seguente:
    soapsuds -url:<ServerUrl?wsdl> -oa:serverexe.dll
  2. Eseguire il server remoto.
    1. Generare il codice proxy utilizzando il comando seguente:
      soapsuds -url:<ServerUrl?wsdl> -gc
    2. Aprire il file con estensione cs Soapsuds.exe genera, rimuovere l'attributo SoapType dalla classe e quindi generare il proxy.
    3. Collegare il proxy al client e quindi eseguire Soapsuds.exe.

      Nota Se il server remoto non è in esecuzione, Soapsuds.exe genera un errore e non genera il codice proxy.
Status
Microsoft ha confermato che questo un bug nei prodotti Microsoft elencati all'inizio di questo articolo.
Informazioni

Procedura per riprodurre il problema

  1. Utilizzare Blocco note per creare un file di testo. Incollare il codice riportato di seguito nel file:
    <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. Salvare il file come C:\ServerChannels.config .
  3. Utilizzare Blocco note per creare un nuovo file di testo. Incollare il codice riportato di seguito nel file:
    <configuration>  <system.runtime.remoting>    <application>      <service>        <activated type="EchoExeTest.TestClass, ServerExe" />      </service>    </application>  </system.runtime.remoting></configuration>
  4. Salvare il file come C:\ServerCao.cfg .
  5. Utilizzare Blocco note per creare un nuovo file di testo. 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. Salvare il file come ServerExe.cs .
  7. Utilizzare Blocco note per creare un nuovo file di testo. Incollare il codice riportato di seguito nel file:
    <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. Salvare il file come C:\ClientChannels.config .
  9. Utilizzare Blocco note per creare un nuovo file di testo. Incollare il codice riportato di seguito nel file:
    <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. Salvare il file come C:\HttpCaoClient.cfg .
  11. Utilizzare Blocco note per creare un nuovo file di testo. 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. Salvare il file come C:\ClientExe.cs .
  13. Utilizzare Blocco note per creare un nuovo file di testo. Incollare il codice riportato di seguito nel file:
    csc ServerExe.csstart serverexe -chan:serverchannels.config -mode:servercao.cfgsoapsuds -url:http://localhost:9998/remoteapplicationmetadata.rem?Wsdl -oa:serverexe.dllcsc /r:serverexe.dll clientexe.csclientexe -chan:clientchannels.config -mode:httpcaoclient.cfg
  14. Salvare il file come c:\Build.bat .
  15. Per Visual Studio .NET 2002, fare clic su Start , scegliere programmi , scegliere Microsoft Visual Studio. NET , Visual Studio .NET Tools , quindi prompt dei comandi di Visual Studio .NET .

    Per Visual Studio .NET 2003, fare clic su Start , scegliere programmi , scegliere Microsoft Visual Studio .NET 2003 , Visual Studio .NET Tools , quindi prompt dei comandi di Visual Studio .NET 2003 .
  16. Al prompt dei comandi, digitare C: e quindi premere INVIO.
  17. Digitare Build.bat e quindi premere INVIO.
  18. Eseguire l'applicazione del server remoto e l'applicazione client remota.

    Si potrebbe essere visualizzato il messaggio di errore menzionato nella sezione "Sintomi" di questo articolo.
Riferimenti
Per ulteriori informazioni su Soapsuds.exe, il seguente sito Web Microsoft Developer Network(MSDN):

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 828987 - Ultima revisione: 01/17/2015 05:23:16 - Revisione: 2.4

Microsoft .NET Framework 1.1

  • kbnosurvey kbarchive kbmt kbproxydev kbcominterop kbremoting kbbug KB828987 KbMtit
Feedback