BUG: 있는 연결되어 있습니다 Soapsuds 프록시 DLL이 있는 클라이언트가 런타임에 있는 원격 예외를 throw합니다.

기술 자료 번역 기술 자료 번역
기술 자료: 828987 - 이 문서가 적용되는 제품 보기.
모두 확대 | 모두 축소

이 페이지에서

현상

클라이언트가 프록시 (Soapsuds.exe) Soapsuds 도구에서 생성하는 DLL 연결될 때 클라이언트가 런타임에 원격 예외를 throw합니다. 다음 오류 메시지와 유사한 오류 메시지가 나타날 수 있습니다.
처리되지 않은 예외: System.Runtime.Remoting.RemotingException: 형식 SOAP: TestClass, 활성화 거부된 권한 http://schemas.microsoft.com/clr/nsassem/EchoExeTest/ServerExe%2C%20Version%3D0.0.0.0%2C%20Culture%3Dneutral%2C%20PublicKeyToken%3Dnull. 서버 스택 추적: 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) 때 한 때

해결 과정

이 문제를 해결하려면 클라이언트 연결하여 작업하려면 다음과 같이 하십시오.
  1. Remoting 서버 응용 프로그램을 실행하고 다음 명령을 사용하여 다음 프록시 생성:
    soapsuds -url:<ServerUrl?wsdl> -oa:serverexe.dll
  2. 원격 서버에서 실행하십시오.
    1. 다음 명령을 사용하여 프록시 코드를 생성할:
      soapsuds -url:<ServerUrl?wsdl> -gc
    2. Soapsuds.exe 생성하는 .cs 파일을 열고 해당 클래스에서 SoapType 특성을 제거할 프록시 빌드.
    3. 프록시 클라이언트로 연결하고 Soapsuds.exe 실행하십시오.

      참고 원격 서버가 실행되지 않는 경우, Soapsuds.exe 오류가 생성하고 프록시 코드를 생성하지 않습니다.

현재 상태

Microsoft는 이 문서의 시작 부분에 나열한 제품에서 문제를 확인했습니다.

추가 정보

문제를 재현하는 방법

  1. 메모장을 사용하여 텍스트 파일을 만듭니다. 파일에 다음 코드를 붙여넣습니다.
    <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. C:\ServerChannels.config 파일을 저장하십시오.
  3. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 파일에 다음 코드를 붙여넣습니다.
    <configuration>
      <system.runtime.remoting>
        <application>
    
          <service>
            <activated type="EchoExeTest.TestClass, ServerExe" />
          </service>
    
        </application>
      </system.runtime.remoting>
    </configuration>
    
  4. C:\ServerCao.cfg 파일을 저장하십시오.
  5. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 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. ServerExe.cs 파일을 저장하십시오.
  7. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 파일에 다음 코드를 붙여넣습니다.
    <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. C:\ClientChannels.config 파일을 저장하십시오.
  9. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 파일에 다음 코드를 붙여넣습니다.
    <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. C:\HttpCaoClient.cfg 파일을 저장하십시오.
  11. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 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. C:\ClientExe.cs 파일을 저장하십시오.
  13. 메모장에서를 새 텍스트 파일을 만들 수 있습니다. 파일에 다음 코드를 붙여넣습니다.
    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. c:\Build.bat 파일을 저장하십시오.
  15. Visual Studio .NET 2002 시작 을 누르고, 프로그램, Visual Studio .NET, Visual Studio .NET 도구 차례로 가리킨 다음 Visual Studio .NET 명령 프롬프트 를 클릭하십시오.

    Visual Studio .NET 2003의 시작 을 누르고, 프로그램, Microsoft Visual Studio .NET 2003, Visual Studio .NET 도구 차례로 가리킨 다음 Visual Studio .NET 2003 명령 프롬프트 를 클릭하십시오.
  16. 명령 프롬프트에서 C: 를 입력한 다음 Enter 키를 누릅니다.
  17. Build.bat 을 입력한 다음 Enter 키를 누릅니다.
  18. 원격 서버 응용 프로그램 및 원격 클라이언트 응용 프로그램을 실행하십시오.

    이 문서의 "현상" 절에서 설명한 오류 메시지가 나타날 수 있습니다.

참조

Soapsuds.exe에 대한 자세한 내용은 다음 Microsoft 개발자 Network(MSDN) 웹 사이트를 방문하십시오.
http://msdn2.microsoft.com/en-us/library/xd176a6c(vs.71).aspx

속성

기술 자료: 828987 - 마지막 검토: 2007년 4월 19일 목요일 - 수정: 2.4
본 문서의 정보는 다음의 제품에 적용됩니다.
  • Microsoft .NET Framework 1.1
키워드:?
kbmt kbproxydev kbcominterop kbremoting kbbug KB828987 KbMtko
기계 번역된 문서
중요: 본 문서는 전문 번역가가 번역한 것이 아니라 Microsoft 기계 번역 소프트웨어로 번역한 것입니다. Microsoft는 번역가가 번역한 문서 및 기계 번역된 문서를 모두 제공하므로 Microsoft 기술 자료에 있는 모든 문서를 한글로 접할 수 있습니다. 그러나 기계 번역 문서가 항상 완벽한 것은 아닙니다. 따라서 기계 번역 문서에는 마치 외국인이 한국어로 말할 때 실수를 하는 것처럼 어휘, 구문 또는 문법에 오류가 있을 수 있습니다. Microsoft는 내용상의 오역 또는 Microsoft 고객이 이러한 오역을 사용함으로써 발생하는 부 정확성, 오류 또는 손해에 대해 책임을 지지 않습니다. Microsoft는 이러한 문제를 해결하기 위해 기계 번역 소프트웨어를 자주 업데이트하고 있습니다.

피드백 보내기

 

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