WCF使用反向代理

时间:2014-05-02 19:21:16

标签: c# wcf iis-7.5 firewall reverse-proxy

我为长篇大论道歉... 我们有一个用组织内部使用的.Net 4.0编写的WCF服务。最近需要在组织网络之外提供此服务。因此,网络人员使用反向代理在组织外部提供此服务。以下是如何设置的图片。

enter image description here

如图所示,服务http://mywebservice.com/readd.svc托管在WIndows 2008 R2上,其内部IP地址为XXX.YYY.ZZZ.RRR。该服务托管在端口80上。

问题是什么?。

在内部,我可以使用WCFTestClient和浏览器以http://mywebservice.com/readd.svc访问服务。但是如果我输入http://mywebservice.com/readd.svc,我会得到" 404文件找不到错误"在WCFTestCleint中我得到错误"错误:无法从http://mywebservice.com/readd.svc获得元数据........."。

但是,如果我在浏览器中键入服务,我会看到显示soap链接的屏幕,如下所示。请忽略LookUpService.svc名称不匹配。 enter image description here

如上图所示......地址栏为https,但soap链接为http。如果我点击http链接http:// ....?wsdl,我找不到错误。这是因为反向代理仅允许连接为https。

如果我使用WCFTextClient并将servicie添加为https://mywebsite.com/readd.svc,我会收到如下错误。

"错误:无法从https://mywebsite.com/readd.svc获取元数据如果这是Windows(R)  您有权访问的Communication Foundation服务,请检查您的访问权限 在指定地址启用元数据发布。有关启用元数据发布的帮助  请参阅http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange错误中的MSDN文档     URI:http://mywebsite.com/readd.svc元数据包含无法解析的引用: ' https://mywebsite.com/readd.svc&#39 ;.内容类型application / soap + xml; charset = utf-8不受支持  按服务https://mywebsite.com/readd.svc
客户端和服务绑定可能不匹配 远程服务器返回错误:(415)OK.HTTP GET错误
 URI:https://mywebsite.com/readd.svc
 网址http://mywebsite.com/readd.svc上的文件未被识别 作为已知文档类型。每种已知类型的错误消息可能对您有所帮助 解决问题: - 来自' XML Schema'是 '无法识别文档格式(内容类型为' text / html; charset = UTF-8')。' .- 来自' http://mywebsite.com/readd.svc'的报告是 '无法识别文档格式(内容类型为' text / html; charset = UTF-8')。' .-  来自' DISCO Document'的报告是'下载' http://mywebsite.com/readd.svc?disco'。'时出错。 -  请求失败,HTTP状态为404:Not Found.-来自' WSDL Document'是'文档格式无法识别(内容类型为' text / html; charset = UTF-8')。'。 "

网络人员通知我以https的形式提供服务。这是我的web.config文件

                                                      

<behaviors>

  <serviceBehaviors>

    <behavior name="ServiceLookup.LookupServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl=""/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>

  </serviceBehaviors>

</behaviors>

 <services>
    <service behaviorConfiguration="ServiceLookup.LookupServiceBehavior" name="SmallApp.ServiceLookUp.LookUpService">

       <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BSBindingConfig" name="SmallApplianceBSEndPoint"
          contract="SmallApp.ServiceLookUp.ILookupService" />


       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    </service>
 </services>
<!-- Remove this during deployment-->
<!--<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>-->

你能否建议如何解决这个问题..因此,组织外的用户可以使用WCFTestCleint作为http / https访问api。

更新了web.config文件                                             
          

    </binding>
    </basicHttpBinding>
</bindings>

<behaviors>

  <serviceBehaviors>

    <behavior name="ServiceLookup.LookupServiceBehavior">
          <serviceMetadata httpGetEnabled="true" httpGetUrl="" httpsGetEnabled="true"/>
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>

  </serviceBehaviors>

</behaviors>

 <services>
    <service behaviorConfiguration="ServiceLookup.LookupServiceBehavior" name="SmallApp.ServiceLookUp.LookUpService">

       <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BSBindingConfig" name="SmallApplianceBSEndPoint"
          contract="SmallApp.ServiceLookUp.ILookupService" />

       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
       <endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
    </service>
 </services>
<!-- Remove this during deployment-->
<serviceHostingEnvironment multipleSiteBindingsEnabled="true"/>

我仍然在访问组织网络外的http或https时出现错误

2 个答案:

答案 0 :(得分:0)

尝试使用traefik。

https://docs.traefik.io/

祝你好运

答案 1 :(得分:0)

通常根据模型的元数据,属性和主机位置动态生成WSDL。因此,如果将wsdl代理到另一个环境,则会出现问题。

servicemetadata中的一个逃生舱口是指定 externalMetadataLocation

一个Uri,其中包含WSDL文件的位置,该文​​件将响应WSDL和MEX请求而不是自动生成的WSDL返回给用户。

在下面添加externalMetadataLocation,如下所示:

<system.serviceModel>
  <behaviors>
    <serviceBehaviors>
      <behavior>
        <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" 
             externalMetadataLocation="https://example.com/SOAP/Service1.wsdl" />
      </behavior>
    </serviceBehaviors>
  </behaviors>
</system.serviceModel>

然后,您可以提前预先生成WSDL,随意进行调整,然后上传修改后的文件作为合同。

进一步阅读