4

我们有一个由 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>

我们错过了什么和/或对可能导致这种情况的任何建议?

谢谢

4

0 回答 0