远程访问 WCF 服务超时错误
Timeout error when accessing WCF service remotely
当我在本地访问 WCF 服务时,它工作正常。为此,我在浏览器中输入:http://localhost:54123/MyService/GetValue
这显示了我预期的 json 格式输出。但是,当使用 http://myIPAddress:54123/MyService/GetValue 远程访问时,我在 Chrome 中得到 ERR_CONNECTION_TIMED_OUT。
我的入站 IP 已列入所有 TCP 端口的白名单,所以我不确定为什么我无法远程访问。如果有任何区别,这将托管在亚马逊 EC2 实例上。
这是我的 main() 方法中用于通过 Topshelf 托管服务的代码
const string serviceUri = "http://localhost:54123/MyService";
var host = HostFactory.New(configurator =>
{
configurator.Service<WcfServiceWrapper<MyServiceClass, IMyServiceClass>>(serviceConfigurator =>
{
serviceConfigurator.ConstructUsing(x =>
new WcfServiceWrapper<MyServiceClass, IMyServiceClass>("MyService", serviceUri));
serviceConfigurator.WhenStarted(service => service.Start());
serviceConfigurator.WhenStopped(service => service.Stop());
});
configurator.RunAsLocalSystem();
configurator.SetDescription("Runs My Service.");
configurator.SetDisplayName("MyService");
configurator.SetServiceName("MyService");
});
这是我的 WcfWrapper start() 方法中的相关代码
var webHttpBinding = new WebHttpBinding(WebHttpSecurityMode.None);
_serviceHost.AddServiceEndpoint(typeof(TServiceContract), webHttpBinding, _serviceUri);
var webHttpBehavior = new WebHttpBehavior
{
DefaultOutgoingResponseFormat = WebMessageFormat.Json
};
_serviceHost.Description.Endpoints[0].Behaviors.Add(webHttpBehavior);
_serviceHost.Open();
openSucceeded = true;
下面是我的配置文件
<configuration>
<system.serviceModel>
<services>
<service name="MyServiceClassNS.MyServiceClass">
<host>
<baseAddresses>
<add baseAddress="http://myIPAddress:54123/MyService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
问题的最可能原因是防火墙阻止了调用。
当我在本地访问 WCF 服务时,它工作正常。为此,我在浏览器中输入:http://localhost:54123/MyService/GetValue
这显示了我预期的 json 格式输出。但是,当使用 http://myIPAddress:54123/MyService/GetValue 远程访问时,我在 Chrome 中得到 ERR_CONNECTION_TIMED_OUT。
我的入站 IP 已列入所有 TCP 端口的白名单,所以我不确定为什么我无法远程访问。如果有任何区别,这将托管在亚马逊 EC2 实例上。
这是我的 main() 方法中用于通过 Topshelf 托管服务的代码
const string serviceUri = "http://localhost:54123/MyService";
var host = HostFactory.New(configurator =>
{
configurator.Service<WcfServiceWrapper<MyServiceClass, IMyServiceClass>>(serviceConfigurator =>
{
serviceConfigurator.ConstructUsing(x =>
new WcfServiceWrapper<MyServiceClass, IMyServiceClass>("MyService", serviceUri));
serviceConfigurator.WhenStarted(service => service.Start());
serviceConfigurator.WhenStopped(service => service.Stop());
});
configurator.RunAsLocalSystem();
configurator.SetDescription("Runs My Service.");
configurator.SetDisplayName("MyService");
configurator.SetServiceName("MyService");
});
这是我的 WcfWrapper start() 方法中的相关代码
var webHttpBinding = new WebHttpBinding(WebHttpSecurityMode.None);
_serviceHost.AddServiceEndpoint(typeof(TServiceContract), webHttpBinding, _serviceUri);
var webHttpBehavior = new WebHttpBehavior
{
DefaultOutgoingResponseFormat = WebMessageFormat.Json
};
_serviceHost.Description.Endpoints[0].Behaviors.Add(webHttpBehavior);
_serviceHost.Open();
openSucceeded = true;
下面是我的配置文件
<configuration>
<system.serviceModel>
<services>
<service name="MyServiceClassNS.MyServiceClass">
<host>
<baseAddresses>
<add baseAddress="http://myIPAddress:54123/MyService"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="True"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
问题的最可能原因是防火墙阻止了调用。