0

Windows サービスでホストされている netTcpRelayBinding WCF サービスを作成しています。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サーバーサービスが開始された後にこのサービスを開始したいです)。

  1. System.TimeoutException: 割り当てられたタイムアウト 00:00:00 内にオープン操作が完了しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。---> System.TimeoutException: net.tcp://xxx.servicebus.windows.net:9351/Src/guid/ へのトランスポート セッションを確立中に、00:00:00 後にオープンがタイムアウトしました。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。---> System.TimeoutException: net.tcp://xxx.servicebus.windows.net:9351/Src/guid/ 経由での接続が 00:00:00 後にタイムアウトしました。1 つの使用可能なアドレス () のうちの 0 に対して接続試行が行われました。チャネルの RemoteAddress を調べて、このエンドポイントの DNS レコードが有効な IP アドレスに対応していることを確認してください。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。System.ServiceModel.Channels で。
  2. System.ArgumentException: issuerSecret が無効です。パラメータ名: Microsoft.ServiceBus.SharedSecretTokenProvider.DecodeSecret(String issuerSecret) の issuerSecret Microsoft.ServiceBus.SharedSecretTokenProvider..ctor(String issuerName, String issuerSecret) Microsoft.ServiceBus.Configuration.TokenProviderElement.CreateTokenProvider() at Microsoft.ServiceBus.Configuration System.ServiceModel.Description.ConfigLoader.LoadBehaviors[T](ServiceModelExtensionCollectionElement の .TransportClientEndpointBehaviorElement.CreateBehavior()1 behaviorElement, KeyedByTypeCollectionSystem.ServiceModel.Description.ConfigLoader.LoadServiceDescription(ServiceHostBase ホスト、ServiceDescription 説明、ServiceElement serviceElement、Action`1 addBaseAddress、Boolean skipHost) で System.ServiceModel.ServiceHostBase.LoadConfigurationSectionInternal(ConfigLoader configLoader、ServiceDescription 説明、ServiceElement) で 1 つの動作、ブール commonBehaviors) ServiceSection) で System.ServiceModel.ServiceHost.ApplyConfiguration() で System.ServiceModel.ServiceHostBase.InitializeDescription(UriSchemeKeyedCollection baseAddresses) で System.ServiceModel.ServiceHost..ctor(Type serviceType, Uri[] baseAddresses) で One234C.Service.WinServiceHost.One23InsightService .OnStart(String[] args) issuerSecret が無効です。
4

2 に答える 2

0

2 番目のエラーは、使用している名前空間の発行者キーが正しくないことを意味します。正しいキーを使用していることを確認する必要がある場合があります。

于 2013-02-07T19:11:29.440 に答える
0

NetTCPRelaybinding の実装のバグのようです。私も同じ問題を抱えています。Servicebus のセクションをリレーします。サービスが表示されているのがわかりますが、relaytype は None です。

于 2016-07-08T04:26:11.840 に答える