BUG: Soapsuds プロキシ DLL にリンクされている、クライアント ファイル名を指定して実行時に、リモート処理例外をスローします。

文書翻訳 文書翻訳
文書番号: 828987 - 対象製品
すべて展開する | すべて折りたたむ

目次

現象

プロキシ Soapsuds ツール (発生) を生成する DLL を使用して、クライアントをリンクした場合は、クライアントは実行時にリモート処理例外をスローします。 このとき、次のようなエラー メッセージが表示されることがあります:
未処理の例外: 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.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext) に System.Runtime.Remoting.Messaging.StackBuilderSink.PrivateProcessMessage(MethodBase mb, Object[] args, Object server, Int32 methodPtr, Boolean fExecuteInContext, Object[]& outArgs) に System.Runtime.Remoting.Activation.ActivationListener.Activate(IConstructionCallMessage ctorMsg) に

回避策

クライアントをリンクすることによってこの問題を回避、次の手順に従います。
  1. リモート処理サーバー アプリケーションを実行して次のコマンドを使用して、プロキシを生成、:
    soapsuds -url:<ServerUrl?wsdl> -oa:serverexe.dll
  2. リモート処理サーバーを実行します。
    1. 次のコマンドを使用してプロキシ コードを生成:
      soapsuds -url:<ServerUrl?wsdl> -gc
    2. 発生によって生成される.cs ファイルを開き、 SoapType 属性、クラスを削除後、プロキシをビルドします。
    3. プロキシをクライアントにリンクして、発生実行します。

      メモ リモート処理サーバーが実行されていない場合発生、エラーが発生し、プロキシ コードを生成しません。

状況

マイクロソフトではこれが、この資料の冒頭に記載されているマイクロソフト製品のバグとして認識しています。

詳細

問題の再現する手順

  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年用 の開始 ] をクリックして、 プログラム Microsoft 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. リモート処理サーバー アプリケーションと、リモート処理クライアント アプリケーション実行します。

    この資料の「現象」に記載されているエラー メッセージが表示されることがあります。

関連情報

発生の詳細については、ご覧次マイクロソフト開発 Network(MSDN) 下さい。
http://msdn2.microsoft.com/en-us/library/xd176a6c(vs.71).aspx

プロパティ

文書番号: 828987 - 最終更新日: 2007年4月19日 - リビジョン: 2.4
この資料は以下の製品について記述したものです。
  • Microsoft .NET Framework 1.1
キーワード:?
kbbug kbremoting kbproxydev kbcominterop kbmt KB828987 KbMtja
機械翻訳の免責
重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。
英語版 KB:828987
Microsoft Knowledge Base の免責: Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。

フィードバック

 

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