none
WCF在不同端口映射环境下的问题 RRS feed

  • 问题

  • 我们需要为一个服务同时提供TCP和WebService等多种接口,因此用C#开发了一个Windows Service来承载WCF,安装在一台内网服务器上,环境为Windows XP SP3,framework 3.5 SP1,VS2008 SP1

    客户端有JAVA的和C#的

    此服务器的80端口映射到3层交换机公网IP的8085端口

    我要把baseAddress配置成 公网IP:8085 ,才能使WCF自动生成的WSDL指向正确的IP和端口

    可是这样一来,WCF变成运行在服务器的8085端口而不是80端口上

    是否有修改配置文件或代码的方式解决这个问题?

    (我们不想通过externalMetadataLocation来给出一个写死的WSDL)

    如果必要,我们可以变更操作系统或使用更高版本的framework

    2010年5月10日 3:29

答案

  • 设置endpoint的address属性为http://公网IP:8085/test/service.svc/basic, 即可。既可以使用公网IP的8085端口访问服务,也可以使用服务器私网IP的80端口访问服务, 和基地址没有关系,可以删除基地址。
    Gao Peter
    2010年6月22日 14:34

全部回复

  • 在实际应用中,最好不要开放metadata。你可以在内网先用svcutil生成服务引用,然后修改客户端使用的app.config或者在代码中指定ServiceClient使用的EndpointAddress,使客户端使用正确的公网服务地址。

    如果一定要开放的话,使用原来的配置(即服务运行在80端口),是可以在公网的8085端口对应地址取得metadata的,但是其中的endpoint address(即wsdl中的address location)肯定是不对的,必须手动修改。

    另外,在这种情况下,由于请求的服务地址和实际服务地址不同,要给服务加上[ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]的attribute。也可以自定义MessageFilter:
    http://msdn.microsoft.com/en-us/library/aa717046.aspx

    希望对你有所帮助。
    2010年5月21日 3:37
  • [ServiceBehavior(AddressFilterMode=AddressFilterMode.Any)]

    这个attribute能在appconfig里针对所有service加么?我没有找到相关项目

    如果加在代码里,会和我已经在appconfig里设置的service behavior冲突么?

    2010年5月31日 4:17
  • 设置endpoint的address属性为http://公网IP:8085/test/service.svc/basic, 即可。既可以使用公网IP的8085端口访问服务,也可以使用服务器私网IP的80端口访问服务, 和基地址没有关系,可以删除基地址。
    Gao Peter
    2010年6月22日 14:34