这里是基于 Azure 支持答案的解决方案。
您需要在 .cscfg 文件中定义一个公共 IP,并将其上传到云服务中。
<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="ILPIPSample" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2014-01.2.3">
<Role name="WebRole1">
<Instances count="1" />
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="UseDevelopmentStorage=true" />
</ConfigurationSettings>
</Role>
<NetworkConfiguration>
<AddressAssignments>
<InstanceAddress roleName="WebRole1">
<PublicIPs>
<PublicIP name="MyPublicIP" domainNameLabel="WebPublicIP" />
</PublicIPs>
</InstanceAddress>
</AddressAssignments>
</NetworkConfiguration>
</ServiceConfiguration>
nslookup WebPublicIP.0.<Cloud Service Name>.cloudapp.net
然后,您可以在实例的Windows防火墙中打开本地端口,并能够直接从互联网连接本地端口。netsh advfirewall firewall add rule name="TCP 端口" protocol=TCP dir=in localport=1000-2000 action=allow
当客户端使用被动模式连接FTP服务器时,它将建立两个连接。一个使用端口21,另一个用于传输数据。
因此,看起来您需要在ServiceDefinition.csdef中打开一个单一的端口,然后在防火墙(负载均衡器)上创建一个端口转发规则,将所有被动端口重定向到该单一端口。
<Endpoints>
<InputEndpoint name="FTP2Azure.Command" protocol="tcp" port="21" localPort="9003" />
<InstanceInputEndpoint name="FTP2Azure.Passive" protocol="tcp" localPort="9002">
<AllocatePublicPortFrom>
<FixedPortRange max="21000" min="20000" />
</AllocatePublicPortFrom>
</InstanceInputEndpoint>
</Endpoints>
这个还没有经过测试,但可能会有所帮助。