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

重要: このサポート技術情報 (以下「KB」) は、翻訳者による翻訳の代わりに、マイクロソフト機械翻訳システムによって翻訳されたものです。マイクロソフトは、お客様に、マイクロソフトが提供している全ての KB を日本語でご利用いただけるように、翻訳者による翻訳 KB に加え機械翻訳 KB も提供しています。しかしながら、機械翻訳の品質は翻訳者による翻訳ほど十分ではありません。誤訳や、文法、言葉使い、その他、たとえば日本語を母国語としない方が日本語を話すときに間違えるようなミスを含んでいる可能性があります。マイクロソフトは、機械翻訳の品質、及び KB の内容の誤訳やお客様が KB を利用されたことによって生じた直接または間接的な問題や損害については、いかなる責任も負わないものとします。マイクロソフトは、機械翻訳システムの改善を継続的に行っています。

英語版 KB: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.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. ファイルを 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) 下さい。

警告: この記事は自動翻訳されています

プロパティ

文書番号:828987 - 最終更新日: 01/17/2015 05:23:16 - リビジョン: 2.4

Microsoft .NET Framework 1.1

  • kbnosurvey kbarchive kbbug kbremoting kbproxydev kbcominterop kbmt KB828987 KbMtja
フィードバック