4

Windows サービスと、作業項目の WCF サービスを呼び出すブートストラップとして機能するコンソール アプリケーションで構成されるソリューションがあります。

外部アクセス用の http プロキシの背後にある閉じたネットワーク内にある顧客環境でソリューションを実行する場合を除いて、これらはすべて正常に機能します。ブートストラッパーが WCF サービスを呼び出すまで、すべてが期待どおりに機能し、24 秒後に次のエラーで終了します。

System.ServiceModel.EndpointNotFoundException: https://www.MyDomian.com/MyService.svcなどでリッスンしているエンドポイントがありませんでした...

さて、キッカーです。ブートストラップを手動で開始すると (exe をダブルクリック)、問題なく WCF サービスに接続します。

既知の事実

  • プロキシは、www.MyDomian.com に対してポート 443 のトラフィックに対して開かれます。
  • お客様のコンピューターの管理者権限があります
  • WCF サービスは Windows Azure でホストされています
  • ソリューションは通常の Web で機能します。
  • WCF は https を使用するように構成されています
  • https://www.MyDomian.com/MyService.svcは、お客様のコンピューターの IE と Chrome の両方からアクセスできます。
  • IE: インターネット オプションは、http-proxy で構成されています
  • Bootstrapper は channelFactory を使用して wcf サービスに接続します

windows-service がブートストラップを開始するために使用するコード:

var p1 = new Process{StartInfo = { UseShellExecute = false, FileName = MyConsoleApplication.exe } };

p1.StartInfo.UseShellExecute = false;
p1.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
p1.StartInfo.RedirectStandardInput = true;
p1.StartInfo.RedirectStandardError = true;
p1.StartInfo.RedirectStandardOutput = true;

p1.Start();

ホスト上の WCF 構成:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="MyBinding"
             maxReceivedMessageSize="500000"
             maxBufferSize="500000"
             maxBufferPoolSize="500000"  
             receiveTimeout="00:02:00" 
             sendTimeout="00:02:00"
             useDefaultWebProxy="true">
      <readerQuotas maxDepth="32"
                    maxStringContentLength="2147483647"
                    maxArrayLength="2147483647"
                    maxBytesPerRead="2147483647"
                    maxNameTableCharCount="2147483647" />
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>

</bindings>
<services>
  <service
    name="MyService"
    behaviorConfiguration="MyServiceBehavior">
    <endpoint address=""
              binding="basicHttpBinding"
              contract="IMyService"
              bindingConfiguration="MyBinding"/>
    <endpoint address="mex"
              binding="mexHttpsBinding"
              contract="IMetadataExchange"/>
  </service>
</services>
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" policyVersion="Policy15" />
    </behavior>
    <behavior name="">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

クライアントでの WCF 構成:

<system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="MyBinding" 
             maxReceivedMessageSize="2147483647" 
             maxBufferSize="2147483647" 
             maxBufferPoolSize="2147483647"
             receiveTimeout="00:02:00" 
             sendTimeout="00:02:00"
             useDefaultWebProxy="true">
      <readerQuotas maxDepth="32"            
                    maxStringContentLength="2147483647" 
                    maxArrayLength="2147483647" 
                    maxBytesPerRead="2147483647"            
                    maxNameTableCharCount="2147483647"/>
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint name="MyService"
            address="https://www.MyDomian.com/MyService.svc"
            binding="basicHttpBinding"
            contract="IMyService"
            bindingConfiguration="MyBinding"/>
</client>

これまでに試した:

  • System.Net アプリ構成要素 (インターネット オプションで定義されたプロキシの使用など)
  • バインディングに対する複数の構成バリエーション。他のバインディングは試していません
  • process.Verb = "runas"
  • Fiddler2 と WireShark は、トンネルが作成されていないことを示しています。(接続時はポート 443 に HTTP トンネルを表示)
  • 競合状態を確認しましたが、何も見つかりません
  • 正しいアプリ構成が読み込まれます
  • 頭を壁にぶつける

更新 1

  • Windows ユーザーの下で Windows サービスを実行すると、ブートストラッパーが接続されましたが、これは数百の外部顧客のインストールになるため、その余裕はありません。
  • NETWORK SERVICE と LOCAL SERVICE の下でサービスを実行しましたが、bootstrapper は例外で終了しました。特権の欠如を示す例外 (コンストラクターが変数を初期化したときに例外がスローされました)。
  • 背後にある http プロキシは .pac ファイルを使用します。system.net -> defaultProxy でこれを指そうとしましたが、運が悪かったです。
  • ブートストラップに特定のプロキシを強制的に使用させるために、別のアプローチを試しています。

これを WCF クライアント構成に追加しました

<system.net>
   <defaultProxy useDefaultCredentials="true">
       <proxy 
          proxyaddress="http://proxy.customerDomain.com:8080/" 
          bypassonlocal="True" 
          scriptLocation="http://config.customerDomain.com/proxy.pac"/>
   </defaultProxy>

見逃したもの、および/またはこれを引き起こす原因についての提案はありますか?

ありがとう

4

0 に答える 0