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>
見逃したもの、および/またはこれを引き起こす原因についての提案はありますか?
ありがとう