我们有一个由 Windows 服务和控制台应用程序组成的解决方案,该应用程序充当引导程序,为工作项调用 WCF 服务。
所有这些都可以正常工作,除非解决方案在客户环境中运行,该客户环境位于 http-proxy 后面的封闭网络中以供外部访问。一切都按预期工作,直到引导程序调用 WCF 服务,该服务在 24 秒后退出并出现以下错误:
System.ServiceModel.EndpointNotFoundException:在https://www.MyDomian.com/MyService.svc等处没有监听端点...
现在,这是踢球者。如果我手动启动引导程序(双击 exe),它会毫无问题地连接到 WCF 服务。
已知事实
- 代理在端口 443 上针对 www.MyDomian.com 的流量打开
- 我们在客户计算机上拥有管理员权限
- WCF 服务托管在 Windows Azure 中
- 解决方案适用于普通网络!
- WCF 配置为使用 https
- https://www.MyDomian.com/MyService.svc可从客户计算机上的 IE 和 Chrome 访问
- IE:Internet Options,配置了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 应用程序配置元素,例如使用 Internet 选项中定义的代理
- 绑定的多种配置变化。没试过其他绑定
- process.Verb = "runas"
- Fiddler2 和 WireShark 显示没有建立隧道。(当它连接时会在端口 443 上显示 HTTP 隧道)
- 检查竞争条件,但找不到任何
- 已加载正确的应用程序配置
- 用头撞墙
更新 1
- 在 windows 用户下运行 windows 服务使引导程序连接,但由于这将是数百个外部客户的安装,我们不会那么奢侈。
- 我在 NETWORK SERVICE 和 LOCAL SERVICE 下运行该服务,但引导程序会异常退出。表示缺少特权的异常(构造函数初始化变量时引发异常)。
- 我们后面的 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>
我们错过了什么和/或对可能导致这种情况的任何建议?
谢谢