我正在使用Net.tcp绑定开发WCF服务。该服务托管在辅助角色的Run方法上。
当部署到我的Azure帐户时,它可以正常工作,但在运行时它会引发异常:
无法建立连接,因为目标计算机主动拒绝它
有时当我更改端口号时,它可以正常工作几次,但是它再次拒绝连接,我必须再次更改端口号...
我在Windows防火墙中做了例外,并且还关闭了防火墙,但它不起作用。
这可能是Windows 7的一些限制吗?任何帮助赞赏。感谢
编辑:我正在添加客户端和服务器代码以便澄清。
服务配置:
using (ServiceHost host = new ServiceHost(typeof(XMPPService)))
{
string ip = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcpinput"].IPEndpoint.Address.ToString();
int tcpport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["tcpinput"].IPEndpoint.Port;
int mexport = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["mexinput"].IPEndpoint.Port;
ServiceMetadataBehavior metadatabehavior = new ServiceMetadataBehavior();
host.Description.Behaviors.Add(metadatabehavior);
ServiceDebugBehavior behavior = host.Description.Behaviors.Find<ServiceDebugBehavior>();
ServiceThrottlingBehavior tho = new ServiceThrottlingBehavior();
tho.MaxConcurrentCalls = 10000;
tho.MaxConcurrentInstances = 1000;
tho.MaxConcurrentSessions = 1000;
host.Description.Behaviors.Add(tho);
if (behavior == null)
{
host.Description.Behaviors.Add(new ServiceDebugBehavior() { IncludeExceptionDetailInFaults = true });
}
else
{
if (!behavior.IncludeExceptionDetailInFaults)
{
behavior.IncludeExceptionDetailInFaults = true;
}
}
Binding mexBinding = MetadataExchangeBindings.CreateMexTcpBinding();
string mexlistenurl = string.Format("net.tcp://{0}:{1}/XMPPServiceMetaDataEndpoint", ip, mexport);
string mexendpointurl = string.Format("net.tcp://{0}:{1}/XMPPServiceMetaDataEndpoint", ip, mexport);
host.AddServiceEndpoint(typeof(IMetadataExchange), mexBinding, mexendpointurl, new Uri(mexlistenurl));
NetTcpBinding tcpBinding = new NetTcpBinding(SecurityMode.None);
tcpBinding.CloseTimeout = TimeSpan.FromMinutes(2);
tcpBinding.ReceiveTimeout = TimeSpan.FromDays(23);
tcpBinding.OpenTimeout = TimeSpan.FromMinutes(3);
tcpBinding.SendTimeout = TimeSpan.FromMinutes(1);
tcpBinding.PortSharingEnabled = true;
tcpBinding.MaxConnections = 10000;
tcpBinding.MaxConnections = 100;
// tcpBinding.ListenBacklog = 1000000;
tcpBinding.ReliableSession.InactivityTimeout = TimeSpan.FromSeconds(90);
tcpBinding.ReliableSession.Enabled = true;
// Add the endpoint for MyService
string listenurl = string.Format("net.tcp://{0}:{1}/ServiceEndpoint", ip, tcpport);
string endpointurl = string.Format("net.tcp://{0}:{1}/ServiceEndpoint", ip, tcpport);
host.AddServiceEndpoint(typeof(IXMPPService), tcpBinding, endpointurl, new Uri(listenurl));
host.Open();
Thread.Sleep(Timeout.Infinite);
}
客户端:
AppService() //private constructor
{
client = new ServiceRef.ServiceClient();
}
服务电话:
bool isAvailable = false;
try
{
isAvailable=client.IsAvailable(_ixo.IMBot.IMEmail, _ixo.Operator.IMClients.First().IMEmail);
}
catch
{
if (client.InnerChannel.State == System.ServiceModel.CommunicationState.Faulted)
{
client.InnerChannel.Abort();
client = new ServiceRef.ServiceClient();
}
}
答案 0 :(得分:0)
由于您的问题是零星的并且更改端口工作了一段时间,因此net.tcp端口共享可能与服务冲突。因此,您在本地使用基于net.tcp的WCF应用程序(在Web或辅助角色中),请确保启用net.tcp端口共享服务以便有效运行。
同样在您的服务启动代码中,您可以正确设置绑定到基本IP地址和端口,如下所示:
NetTcpBinding binding = new NetTcpBinding();
binding.PortSharingEnabled = true;
// Setup other binding properties here.
// Service_NAME is the Serice Name in this project
ServiceHost host = new ServiceHost(typeof(Service_NAME));
//Endpoint1 is the End point name you have setup in your Windows Azure Role property
string serviceIP = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint.Address.ToString();
string servicePort = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["Endpoint1"].IPEndpoint.Port.ToString();
//
string address = String.Format("net.tcp://{0}:{1}/SERVICE_METHOD*", serviceIP, servicePort);
host.AddServiceEndpoint(typeof(YOUR_SERVICE_TYPE), binding, address);
host.Open();
答案 1 :(得分:0)
“我发现了正在发生的事情:分配给辅助角色的IP是动态的。有时它是127.255.0.0,其他时间是127.255.0.1”
我认为你犯了同样的错误。见这里:
Azure Compute Emulator: Is it possible to control the IP of individual instances?