9

私はそれ自身のアセンブリに手書きの WCF プロキシを持っています。それは非常に簡単です:

public class MyServiceClient : ClientBase<IMyService>, IMyService
{
    public MyServiceClient()
    {
    }

    public MyServiceClient(string endpointConfigurationName) :
        base(endpointConfigurationName)
    {
    }
}

これをPowershellスクリプトにロードしています:

Add-Type -Path "$LocalPath\MyService.Client.dll"
Add-Type -Path "$LocalPath\MyService.Contracts.dll"

次に、スクリプト自体ではなく、構成で定義されたエンドポイントを使用してクライアントをインスタンス化できるように、(SO に関する他の投稿に従って) App.config を設定しようとしています。

[System.AppDomain]::CurrentDomain.SetData("APP_CONFIG_FILE", "$LocalPath\MyService.Client.dll.config")

AppDomain を確認しましたが、構成ファイルがそのConfigurationFileプロパティとして設定されています。

クライアントのインスタンスを作成するとき:

$endpointName = "MyServiceHttpEndpoint" # defined in the app.config file
$myclient = New-Object MyService.Client.MyServiceClient($endpointName)

それは言って倒れます:

Exception calling ".ctor" with "1" argument(s): "Could not find endpoint element with name 'MyServiceHttpEndpoint' and contract 'MyService.Contracts.IMyService' in the ServiceModel client configuration section. This might be because no configuration file was found for your application, or because no endpoint element matching this name could be found in the client element."

何か案は?スクリプト ファイルに手動でエンドポイントを作成したくありません。構成から読み取る必要があります。

4

5 に答える 5

0

アセンブリは 32​​ ビットまたは 64 ビット ターゲットとしてビルドされていますか?

複数のケースで 32/64 問題に遭遇しました。

64 ビット OS で実行している場合は、64 ビット (通常) と 32 ビット (32 個の外部アセンブリが必要な場合に興味深い) の 2 つの PowerShell があることに注意してください。

于 2013-03-20T04:31:01.313 に答える
0

完全な構成を投稿した方が簡単ですが、次のセクションが欠落しているようです。

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding">
          <security mode="TransportCredentialOnly">
            <transport clientCredentialType="Windows" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="ServiceAddress"
        binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding"
        contract="MyService.Contracts.IMyService" name="MyServiceHttpEndpoint" />
    </client>
</system.serviceModel>

あなたはそうではないとかなり確信しているように聞こえますが。

それでは、PowerShell アプリが構成を正しく取得していることを確認してみましょう...

PowerShell アプリが期待どおりに構成を取得しているかどうかを確認するには、powershell ファイルに次のようなものを追加します。

Get-Content $LocalPath\MyService.Client.dll.config | foreach {Write-Output $_}

それが構成の問題ではない場合、私たちはそれについて同意できると思います.

では、dll は構成の設定を確認できますか? これで、powershell が構成を認識し、dll を呼び出すことができることがわかりました。

config は dll と同じ場所にありますか?

add-type は私たちが期待していないことをしますか? msdn docs を見ると、 add-type のように見えます

Microsoft .NET Framework 型 (クラス) を Windows PowerShell セッションに追加します。

クラスが現在 powershell セッションにある場合、通常のように構成にアクセスできますか? 知らない。

[Reflection.Assembly]::LoadFromむしろ試しadd-typeてみて、それが違いを生むかどうかを確認してください。

残念ながら正確な答えはありませんが、私のとりとめのないことが多少役立つことを願っています.

于 2013-03-21T00:32:18.773 に答える
0

バインディングのタイプが欠落しているようです。powershell を使用している場合は、basicHttpBinding である必要があります。

コードを次のようにします。

$endpointName = "MyServiceHttpEndpoint" 
$httpBinding = new-object System.ServiceModel.WSHttpBinding
$myclient = New-Object MyService.Client.MyServiceClient($httpBinding, $endpointName)
于 2013-03-25T13:45:06.503 に答える