2

vs2010 でクラス ライブラリ プロジェクト [MyLibrary] を作成し、Service Reference [http://127.0.0.1/MyService.svc] を追加します。そのため、app.config にそのようなノードが含まれます。

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_IMyService" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://127.0.0.1/MyService.svc"
            binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IMyService"
            contract="MyService.IMyService" name="BasicHttpBinding_IMyService" />
    </client>
</system.serviceModel>

MyLibrary プロジェクトをコンパイルすると、MyLibrary.dll と MyLibrary.dll.config が生成されます。通常、次のような wcf メソッドを呼び出すことができます。

MyService.MyServiceClient client = new MyServiceClient(); 

int 結果 = client.Add(3,6);

app.config を programe で操作していません。うまく動作します。

ここで、MyLibrary.dll をロードし、refelection を使用して wcf メソッドを呼び出す別のプログラムを作成します。ServiceModel クライアント構成セクションでコントラクト 'MyService.IMyService' を参照するデフォルトのエンドポイント要素が見つかりませんでした。これは、アプリケーションの構成ファイルが見つからなかったか、このコントラクトに一致するエンドポイント要素がクライアント要素に見つからなかったためである可能性があります。

実行時にリフレクションを使用して app.config の構成を読み取っていないと思います。そのような方法を使用しようとしましたが、まだ機能しません。

string assemblyPath = Assembly.GetExecutingAssembly().Location;
string configPath = assemblyPath + ".config";
currentDomain.SetData("APP_CONFIG_FILE", configPath);
typeof(ConfigurationManager)
    .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, 0);

typeof(ConfigurationManager)
    .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, null);

typeof(ConfigurationManager)
    .Assembly.GetTypes()
    .Where(x => x.FullName == "System.Configuration.ClientConfigPaths").First()
    .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static)
    .SetValue(null, null);

上記の wcf コードの呼び出しを変更したくない場合は、どうすればよいですか? 実行時にリフレクションを使用して app.config を読み込んで認識させる方法。無駄な反省のようです.Thanks!

4

2 に答える 2

0

リフレクション経由の呼び出しとは関係ありません。Mylibrary.dll.configの構成が見つからないことを示すエラー メッセージが表示されます。新しいプログラムの app.config (または web.config) に構成を追加せずに、Mylibrary.dll を直接参照するクライアント コードを呼び出すと、同じエラーが発生します。

MyService.MyServiceClient client = new MyServiceClient(); 

デフォルトでは、上記のコードは現在実行中のプロセスの構成ファイルを調べて、<system.servicemodel>. 新しいプログラムの構成には、Mylibrary.dll.config ファイル内の情報を構成ファイルに追加する必要があります。それ以外の場合は、クライアントをコードで直接構成する必要があります。

于 2013-03-01T09:02:20.243 に答える
0

<system.servicemodel>セクションを MyLibrary.dll.config からアプリケーション参照 MyLibrary.dll の app.config にコピーする必要があります。それで十分なはずです。とにかく、あなたは app.config をロードする方法を尋ねています。この投稿では、任意のファイルから WCF クライアント構成を読み込む方法について説明しました。ただし、servicemodel セクションをコピーするだけで十分です。

于 2013-03-01T08:52:57.183 に答える