Это мой 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 в качестве первого потомка тега конфигураций , поэтому службе не удалось прочитать настройки. Сейчас работает нормально.