Ошибка службы Windows: процесс неожиданно прерван - PullRequest
0 голосов
/ 31 августа 2018

Это мой App.Config -

 <configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
    </startup>

  <setting name="RunAsWindowsService" serializeAs="String">
    <value>True</value>
  </setting>

    <AppSettings>
      <settings>
        <settings>
    <add key="ConnectionString" value="Server=WIN-OTVR1M4I567;Database=CresijCam;Integrated Security=SSPI;" />
  </settings>
      </settings>

    </AppSettings>


</configuration>

Это мой код для вызова метода -

public partial class Service1 : ServiceBase
    {
        Thread th = null;
        public Service1()
        {
            InitializeComponent();
             th = new Thread(AsynchronousSocketListener.StartListening);
        }


        protected override void OnStart(string[] args)
        {
            try {

                th.Start();
                // Log an event to indicate successful start.
                EventLog.WriteEntry("Successful start.", EventLogEntryType.Information);

            }
            catch(Exception ex)
            {
                // Log the exception.
                EventLog.WriteEntry(ex.Message, EventLogEntryType.Error);
            }
        }

        protected override void OnStop()
        {
            th.Abort();
        }
    }

Вот код -

 public class AsynchronousSocketListener
{

   static string path = @"E:\F\trythis\TCPService\bin\Debug\TCPService.exe";
    static Configuration config = ConfigurationManager.OpenExeConfiguration(path);

    static string constr = config.AppSettings.Settings["ConnectionString"].Value;

    // Thread signal.  
     public static ManualResetEvent allDone = new ManualResetEvent(false);

    private AsynchronousSocketListener()
    {

    } 
    public static void StartListening()
    {
        // Establish the local endpoint for the socket.  
        // The DNS name of the computer  


        IPEndPoint localEndPoint = new IPEndPoint(IPAddress.Any, 1200);

        // Create a TCP/IP socket.  
        Socket listener = new Socket(AddressFamily.InterNetwork,
            SocketType.Stream, ProtocolType.Tcp);

        // Bind the socket to the local endpoint and listen for incoming connections.  
        try
        {
            listener.Bind(localEndPoint);
            listener.Listen(200);

            while (true)
            {
                // Set the event to nonsignaled state.  
                 allDone.Reset();

                // Start an asynchronous socket to listen for connections.  

                listener.BeginAccept(
                    new AsyncCallback(AcceptCallback),
                    listener);

                // Wait until a connection is made before continuing.  
                 allDone.WaitOne();
            }

        }
        catch (Exception e)
        {

        }



    }


 public static  void AcceptCallback(IAsyncResult ar)
    {
        // Signal the main thread to continue.  
         allDone.Set();

        // Get the socket that handles the client request.  
        Socket listener = (Socket)ar.AsyncState;
        Socket handler = listener.EndAccept(ar);
        string ip = ((IPEndPoint)handler.RemoteEndPoint).Address.ToString();

        // Create the state object.  
        StateObject state = new StateObject();
        state.workSocket = handler;

        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReadCallback), state);
    }

Эта служба предназначена для создания прослушивателя TCP, который непрерывно работает в фоновом режиме и обновляет данные в базе данных, чтобы я мог использовать эти данные через свое веб-приложение. Если вам нужен код для метода, вызываемого здесь ... Я добавлю это здесь ... Но я думаю, что код не содержит ошибок, потому что этот код работает в приложении Windows Form.

Любые предложения будут оценены. Спасибо

Я изменил код согласно сказанному здесь - https://stackoverflow.com/a/27544887/9650643

получение строки подключения из файла service.exe.config.

static Configuration config = ConfigurationManager.OpenExeConfiguration("E:\\F\\trythis\\TCPService\\bin\\Debug\\TCPService.exe");

    static string constr = config.AppSettings.Settings["ConnectionString"].Value;

введите описание ссылки здесь

Теперь у меня другая проблема -

Приложение: TCPService.exe Framework Версия: v4.0.30319 Описание: Процесс был прерван из-за необработанного исключения.

Исключение Информация: System.NullReferenceException в TCPService.AsynchronousSocketListener..cctor ()

Информация об исключении: System.TypeInitializationException в TCPService.AsynchronousSocketListener.StartListening () в System.Threading.ThreadHelper.ThreadStart_Context (System.Object) в System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) в System.Threading.ThreadHelper.ThreadStart ()

Я пытался добавить строку подключения всеми возможными способами. Я не понимаю сейчас, что вызывает эту ошибку

Добавлено: как я инициализирую строку databaseConfiguration в приведенном выше коде. Если возможно, пожалуйста, дайте мне знать, если я делаю инициализацию неправильно. Я пробовал 2-3 разными способами. Другой способ, которым я попробовал, - Я удалил appsetting и добавил это в App.config

<connectionStrings>
    <remove name="LocalSqlServer"/>
    <add name="CresijCamConnectionString" connectionString="Integrated Security=SSPI;Persist Security Info=False;Data Source=WIN-OTVR1M4I567;Initial Catalog=CresijCam" providerName="System.Data.SqlClient"/>
  </connectionStrings>

И Я удалил это, которое я создал выше в Class AsynchronousSocketListener

путь статической строки = @ "E: \ F \ trythis \ TCPService \ Bin \ Debug \ TCPService.exe";

статическая конфигурация config = ConfigurationManager.OpenExeConfiguration (путь); * * тысяча пятьдесят два

 static string constr =  config.AppSettings.Settings["ConnectionString"].Value;

И добавил это в класс -

static string constr = ConfigurationManager.ConnectionStrings["CresijCamConnectionString"].ConnectionString;

Но оба не работают

App.Config не имел тега configSection в качестве первого потомка тега конфигураций , поэтому службе не удалось прочитать настройки. Сейчас работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...