无法连接到Docker容器中托管的WCF服务

时间:2017-05-15 15:12:35

标签: c# wcf docker windows-services topshelf

我正在尝试运行一个在Docker容器中公开WCF服务的应用程序。

该应用程序是使用TopShelf构建的,因此它可以作为Windows服务或(在开发中)作为独立控制台程序运行。

我遇到的问题是WCF测试客户端无法获取元数据。值得一提的是,应用程序在本地执行时可以正常工作。

以下是当应用程序在本地运行时由WCF测试客户端生成的元数据文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="NetTcpBinding_ITestWcfDocker" sendTimeout="00:05:00">
                    <security mode="None" />
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:9998/" binding="netTcpBinding"
                bindingConfiguration="NetTcpBinding_ITestWcfDocker" contract="ITestWcfDocker"
                name="NetTcpBinding_ITestWcfDocker" />
        </client>
    </system.serviceModel>
</configuration>

这是我正在使用构建容器的Dockerfile

FROM microsoft/dotnet-framework:4.6.2
RUN powershell -Command Add-WindowsFeature NET-WCF-HTTP-Activation45
WORKDIR app
COPY bin/Release/net461 .
EXPOSE 9998 9999
ENTRYPOINT ["EMG.Service.TestWcfDocker.exe"]

构建项目后,我使用此命令构建容器

docker build -t emg/test-wcf:latest .

然后我用这个命令启动一个容器

docker run -p 9998:9998 -p 9999:9999 -t emg/test-wcf

这是我在控制台日志中获得的输出

Configuration Result:
[Success] Name EMG.TestWcfDocker, [Success] DisplayName EMG TestWcfDocker, [Success] Description EMG TestWcfDocker, [Success] ServiceName EMG.TestWcfDocker
Topshelf v4.0.0.0, .NET Framework v4.0.30319.42000
2017-05-15 15:46:48.0700|DEBUG|WcfServiceHost|Adding NetTcpBinding endpoint for ITestWcfDocker at net.tcp://localhost:9998/
2017-05-15 15:46:48.1012|DEBUG|WcfServiceHost|Adding Metadata endpoint at http://localhost:9999/
2017-05-15 15:46:49.2207|INFO|EMG.TestWcfDocker.Program|Starting EMG.TestWcfDocker
The EMG.TestWcfDocker service is now running, press Control+C to exit.
2017-05-15 15:46:50.2675|INFO|EMG.TestWcfDocker.Program|EMG.TestWcfDocker started

启动容器后,我用它来获取容器的IP

docker inspect -f="{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" container-name

然后我使用返回的IP通过WCF测试客户端连接到服务,但是我收到此错误消息

Error: Cannot obtain Metadata from http://172.19.111.72:9999/ If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified address.  For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata Exchange Error    URI: http://172.19.111.72:9999/    Metadata contains a reference that cannot be resolved: 'http://172.19.111.72:9999/'.    There was no endpoint listening at http://172.19.111.72:9999/ that could accept the message. This is often caused by an incorrect address or SOAP action. See InnerException, if present, for more details.    Unable to connect to the remote server    A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 172.19.111.72:9999HTTP GET Error    URI: http://172.19.111.72:9999/    There was an error downloading 'http://172.19.111.72:9999/'.    Unable to connect to the remote server    A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 172.19.111.72:9999

如果我使用localhost,我会收到类似的错误。

TL; DR:

我在Docker容器中有一个WCF服务,我无法从主机连接到它。

1 个答案:

答案 0 :(得分:-1)

因此,您需要为TCP托管支持执行此操作:

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

安装IIS上托管的WCF服务所需的Windows组件

RUN Add-WindowsFeature NET-WCF-TCP-Activation45; \
Add-WindowsFeature NET-WCF-HTTP-Activation45; \
Add-WindowsFeature Web-WebSockets

为IIS上的默认网站启用net.tcp协议

RUN windows\system32\inetsrv\appcmd.exe set app 'Default Web Site/' /enabledProtocols:"http,net.tcp"

EXPOSE 808