2013-02-07 74 views
0

我正在编写Windows服务中托管的netTcpRelayBinding WCF服务。由于缺乏Windows服务开发经验,我觉得我的代码很幼稚。这从Windows-Azure中调用。您能否帮我查看一下代码,以及我如何即兴创作: - 我们使用NLOG进行日志记录。netTcpRelayBinding Windows服务中托管的WCF服务 - 标准实践

我的服务抛出异常(问题结束时提到)。

应该如何: - 1.定义Windows服务依赖关系(它应该在机器获得 连接到互联网之前开始)。 2.它应该如何更容错,如何在一定的时间间隔后启动。

namespace XYC.Service.WinServiceHost 
    { 
     public partial class XYCService : ServiceBase 
     { 
      private ServiceHost serviceHost = null; 
      private static readonly NLog.Logger Logger = NLog.LogManager.GetCurrentClassLogger(); 
      public One23InsightService() 
      { 
       // Name the Windows Service 
       ServiceName = "XYCService "; 
       const string logName = "Application"; 
       InitializeComponent(); 
       if (!System.Diagnostics.EventLog.SourceExists(ServiceName)) 
       { 
        System.Diagnostics.EventLog.CreateEventSource(ServiceName, logName); 
       } 
       EnLog.Source = ServiceName; 
       EnLog.Log = logName; 
      } 

      protected override void OnStart(string[] args) 
      { 
       if (serviceHost != null) 
       { 
        serviceHost.Close(); 
       } 
       EnLog.WriteEntry(ServiceName + " Inside OnStart..."); 
       try 
       { 
        serviceHost = new ServiceHost(typeof(InsightSrcDataService)); 

        serviceHost.Faulted += HostFaulted; 
        serviceHost.UnknownMessageReceived += HostUnknownMessageReceived; 

        serviceHost.Open(); 
        LogServiceInfo(serviceHost); 
        if (serviceHost.State != CommunicationState.Faulted) 
        { 
         EnLog.WriteEntry(ServiceName + " started successfully."); 
         EnLog.WriteEntry(ServiceName + " Automapping of entities are done successfully."); 
        } 
       } 
       catch (Exception ex) 
       { 
        string msg = ServiceName + " failed to start. Exception Message:-" + ex.Message + (ex.InnerException != null ? ex.InnerException.Message : string.Empty); 
        EnLog.WriteEntry(msg); 
        Logger.LogException(NLog.LogLevel.Error, msg, ex); 
       } 
      } 

      private void LogServiceInfo(ServiceHost host) 
      { 
       EnLog.WriteEntry(host.Description.ServiceType + "is up and running with these endpoints :"); 
       foreach (ServiceEndpoint se in host.Description.Endpoints) 
       { 
        EnLog.WriteEntry(se.Address.ToString()); 
       } 
      } 

      private void HostUnknownMessageReceived(object sender, UnknownMessageReceivedEventArgs e) 
      { 
       EnLog.WriteEntry(ServiceName + " Inside UnknownMessageReceived."); 
      } 

      private void HostFaulted(object sender, EventArgs e) 
      { 
       EnLog.WriteEntry(ServiceName + " - Host Faulted."); 
      } 

      protected override void OnStop() 
      { 
       if (serviceHost == null) return; 
       serviceHost.Close(); 
       serviceHost = null; 
      } 
     } 
    } 

Configuration

<system.serviceModel> 
    <services> 
     <service name="XYC.Service.WCFNetTCPContract.DataService"> 
     <endpoint 
      name="SrcWeb" 
      address="sb://data.servicebus.windows.net/App/long-guid" 
        binding="netTcpRelayBinding" 
        contract="XYC.Service.Interface.IService" 
        bindingConfiguration="Hybrid" 
        behaviorConfiguration="sbTokenProvider" /> 

     <endpoint 
      name="AdminServiceEndpoint" 
      address="sb://serviceaddress.servicebus.windows.net/Admin/long-guid" 
        binding="netTcpRelayBinding" 
        contract="One234C.Service.AdminInterface.IOne23AdminService" 
        bindingConfiguration="Hybrid" 
        behaviorConfiguration="sbTokenProvider" /> 
     </service> 
    </services> 
    <bindings> 
     <netTcpRelayBinding> 
     <binding name="Hybrid" connectionMode="Hybrid" maxReceivedMessageSize="500000"> 
      <security mode="None" /> 
     </binding> 
     </netTcpRelayBinding> 
    </bindings> 
    <behaviors> 

     <serviceBehaviors> 
     <behavior> 
      <!-- To avoid disclosing metadata information, 
      set the values below to false before deployment --> 
      <serviceMetadata httpGetEnabled="False" httpsGetEnabled="False" /> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="False" /> 
     </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
     <behavior name="sbTokenProvider"> 
      <transportClientEndpointBehavior> 
      <tokenProvider> 
       <sharedSecret issuerName="owner" issuerSecret="xyc" /> 
      </tokenProvider> 
      </transportClientEndpointBehavior> 
     </behavior> 
     </endpointBehaviors> 
    </behaviors> 
    <extensions> 
    </extensions> 
    </system.serviceModel> 

这有时会抛出以下异常(我想这是缺乏Windows服务的依赖,我想这项服务,启动时启动后,机器可以连接到互联网& SQL Server服务)。

  1. System.TimeoutException:打开操作没有在 分配的超时时间00:00:00内完成。分配给此 操作的时间可能是较长超时的一部分。 ---> System.TimeoutException://xxx.servicebus.windows.net:9351/src目录/ GUID /开放日00:00:00,而 建立传输会话 的net.tcp后超时。分配给此操作的时间 可能是更长的 超时的一部分。 ---> System.TimeoutException:连接到通过 net.tcp://xxx.servicebus.windows.net:9351/Src/guid /超时后 00:00:00。连接尝试次数为0(共1个) addresses()。检查您的频道的RemoteAddress并验证DNS记录的此端点的DNS记录对应于有效的IP 地址。分配给此操作的时间可能是较长超时的 部分。在在
  2. System.ArgumentException System.ServiceModel.Channels.SocketConnectionInitiator.CreateTimeoutException(URI URI,时间跨度超时,ip地址[]的地址,的Int32 invalidAddressCount,SocketException的InnerException):issuerSecret无效。参数名: issuerSecret在 Microsoft.ServiceBus.SharedSecretTokenProvider.DecodeSecret(字符串 issuerSecret)在 Microsoft.ServiceBus.SharedSecretTokenProvider..ctor(字符串 证书中issuerName,字符串issuerSecret)在 Microsoft.ServiceBus.Configuration.TokenProviderElement.CreateTokenProvider() 在 Microsoft.ServiceBus.Configuration.TransportClientEndpointBehaviorElement.CreateBehavior() 在 System.ServiceModel.Description.ConfigLoader.LoadBehaviors [T](ServiceModelExtensionCollectionElement 1 behaviorElement, KeyedByTypeCollection 1种行为,布尔 commonBehaviors)在 System.ServiceModel.Description.ConfigLoader.Loa dServiceDescription(ServiceHostBase host,ServiceDescription description,ServiceElement serviceElement, Action`1 addBaseAddress,Boolean skipHost)at System.ServiceModel.ServiceHostBase。LoadConfigurationSectionInternal(ConfigLoader configLoader,ServiceDescription描述,ServiceElement serviceSection)在 System.ServiceModel.ServiceHost.ApplyConfiguration()在 System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses)在System.ServiceModel.ServiceHost..ctor( 类型的serviceType,乌里[] baseAddresses)在 One234C.Service.WinServiceHost.One23InsightService.OnStart(字符串[] 参数)issuerSecret是无效的。

回答

0

那么第二个错误意味着你正在使用的命名空间发行方密钥不正确。您可能需要检查以确保您使用的是正确的密钥。

0

貌似在实施的NetTCPRelaybinding的错误。我也有同样的问题。我中继Servicebus的部分,我可以看到正在显示的服务,但relaytype是无。