Я пишу службу WCF netTcpRelayBinding, размещенную в службе Windows. Мне кажется, что мой код наивен из-за отсутствия опыта разработки служб Windows. Это вызывается из Windows-Azure. Не могли бы вы помочь мне просмотреть код и то, как я могу его импровизировать: - мы используем NLOG для регистрации.
Моя служба выдает исключение (упомянуто в конце вопроса).
Как мне: - 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).
- System.TimeoutException: операция открытия не была завершена в течение отведенного тайм-аута 00:00:00. Время, отведенное для этой операции, могло быть частью более длительного тайм-аута. ---> System.TimeoutException: время ожидания истекло после 00:00:00 при установке транспортного сеанса на net.tcp: //xxx.servicebus.windows.net: 9351 / Src / guid /. Время, отведенное для этой операции, могло быть частью более длительного тайм-аута. ---> System.TimeoutException: подключение к через net.tcp: //xxx.servicebus.windows.net: 9351 / Src / guid / истекло время ожидания после 00:00:00. Были предприняты попытки подключения к 0 из 1 доступного адреса (). Проверьте RemoteAddress своего канала и убедитесь, что записи DNS для этой конечной точки соответствуют действительным IP-адресам. Время, отведенное для этой операции, могло быть частью более длительного тайм-аута. в System.ServiceModel.Channels.SocketConnectionInitiator.CreateTimeoutException (Uri uri, тайм-аут TimeSpan, адреса IPAddress [], Int32 invalidAddressCount, SocketException innerException) в
- System.ArgumentException: IssueerSecret недействителен. Имя параметра: IssuerSecret в Microsoft.ServiceBus.SharedSecretTokenProvider.DecodeSecret (String IssueerSecret) в Microsoft.ServiceBus.SharedSecretTokenProvider..ctor (String IssuerName, String IssuerSecret) в Microsoft.ServiceBus.Configuration.TokenProviderTokenProvider .TransportClientEndpointBehaviorElement.CreateBehavior () в System.ServiceModel.Description.ConfigLoader.LoadBehaviors [T] (ServiceModelExtensionCollectionElement
1 behaviorElement, KeyedByTypeCollection
1 поведения, логическое описание commonBehaviors, ServiceDescriptionDescriptionElement1 behaviorElement, KeyedByTypeCollection
1, описание_дисциплины_обслуживания) в System.ServiceDescriptionDescriptionDescription.дис. , Boolean skipHost) в System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal (ConfigLoader configLoader, описание ServiceDescription, ServiceElement serviceSection) в System.ServiceModel.ServiceHost.ApplyConfiguration () в System.ServiceModel.Serv iceHostBase.