|
I agree 100%. Now I know why you guys suggested just writing a console app first.
But I made it past the painful part, and figured I would just finish the windows service.
I haven't really set the timers yet. I have 2 timers, 1 check timer and 1 job timer. I figure the check timer would run twice a day and book jobs for the job timer, the job timer would only run if jobs are present.
Would of been much easier to just write a console app and schedule each job individually.
I'm almost done, just need to start and stop the send message thread if I stop the service while jobs are running.
[EDIT]
I choose the windows service because I run the website on a server core with minimum GUI. My preference was server core with no GUI, but I needed the shell window in order to use FFMPEG, which is a console app. So the console app left a bad taste, and I opted for writing something for use in the future.
modified 6-Oct-14 13:33pm.
|
|
|
|
|
I stated my service project.
So I could not find instalutil on my hard drive, searched, OK, you just write a built-in one.
So I guess I need to get it installed first, and then running so I can attach to it to use the debugger.
Found this here on CJ
Translated it to VB
I think the path is wrong that I'm feeding to the installer class _servicePath, but I can't figure out a way to check the value.
Description: The process was terminated due to an unhandled exception.
Exception Info: System.IO.IOException
Public Shared Function install() As Integer
Dim dwExitCode As Integer = 2
Try
Dim servicePath As String = Reflection.Assembly.GetExecutingAssembly.Location
smtp_messenger.eventLog1.WriteEntry(servicePath, EventLogEntryType.Information, 1)
Dim pathArray() As String = {servicePath}
ManagedInstallerClass.InstallHelper(pathArray)
dwExitCode = 0
Catch ex As Exception
dwExitCode = 1
smtp_messenger.eventLog1.WriteEntry(ex.Message, EventLogEntryType.Information, 1)
End Try
Return dwExitCode
End Function
Plus I don't get the eventlog thing, Am I using this right here? The MyServer, Should I replace that with my machine name?
eventLog1 = New System.Diagnostics.EventLog()
If (Not System.Diagnostics.EventLog.SourceExists(eventSourceName, "MyServer")) Then
System.Diagnostics.EventLog.CreateEventSource(eventSourceName, logName)
End If
eventLog1.Source = eventSourceName
eventLog1.Log = logName
eventLog1.WriteEntry("Service has installed successfully", EventLogEntryType.Information, 1)
So I guess in a service, you can't display a message box. Not sure about the console line, I just need to be able to see some values so I can at least get the service installed and running.
|
|
|
|
|
It was the event log cal to CreateEventSource, I guess you have to manually create the key first and the parameters before you can use the service. And assign permissions as well.
So I rewrote it to this
Dim mySourceName As String = "smtpMessenger"
Dim myLogName As String = "Application"
Dim myServerName As String = Environment.MachineName
eventLog1 = New System.Diagnostics.EventLog()
If Not (System.Diagnostics.EventLog.SourceExists(mySourceName)) Then
Dim eventSourceData As EventSourceCreationData = New EventSourceCreationData(mySourceName, myLogName)
eventSourceData.Source = mySourceName
eventSourceData.LogName = myLogName
eventSourceData.MachineName = myServerName
System.Diagnostics.EventLog.CreateEventSource(eventSourceData)
End If
eventLog1.Source = mySourceName
eventLog1.Log = myLogName
eventLog1.MachineName = myServerName
About event ID's, I assigned an ID of 1 for creating the install, but I get this message, any help would be appreciated.
The description for Event ID 1 from source smtpMessenger cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
Do I have to create a description file for each ID I assign to an event?
|
|
|
|
|
1. Service can not interact with UI (messages) by default, but it can be changed. However the better way is to use some helper that reads the state/configuration of a running server and adjust it as needed...
2. I didn't understood the other parts - are you trying to create a self installing service?
I'm not questioning your powers of observation; I'm merely remarking upon the paradox of asking a masked man who he is. (V)
|
|
|
|
|
This is my first service that I'm composing.
I need some ideas on how to store and pick up stuff like database sql connector, and other stuff.
I'm thinking registry keys, so is it normal to write a windows app that stores information for the service to pickup?
I guess the windows app could also start and stop the service as well, and give the status of the service.
Just looking for some ideas here, based on your experience.
|
|
|
|
|
yes, you really only have two options
registry key(s)
config files - app.config or other file
of course, they can contain minimal info, like the connection to the database and have the rest of the config data stored as key:value pairs in a separate table
Then usually one or more helper programs - one to set up/maintain the config info (especially if all/some is encrypted), and a 'tray helper' program that displays status, allows control of the service etc
A service Im writing at the moment also has
a) an in memory database for statistics (in addition to using performance counters etc)
b) an in-built telnet & http server to inspect values (and maybe control some aspects of the service)
'g'
|
|
|
|
|
oh OK
Those are good ideas.
Guess I'll write the helper programs first, and a skeleton service for testing. And the tray, not sure how to write one but I'll figure it out.
Thanks!
|
|
|
|
|
if you wanted to cut out writing the 'boilerplate' yourself, look at something like cinchoo http://cinchoo.com/category/application-host/?orderby=ID&order=ASC[^] - my only bugbear with it is its not open source - there are other 'service frameworks' out there iirc - while writing a service from scratch once is 'useful', the real work is the service 'tasks', so using a pre-built framework allows you to focus on that
hth
|
|
|
|
|
Avoid the registry; use a config file (of your own design if you like).
If the Service(s) store status in the database, then any number of clients (Console, WinForms, Tray) can report status and allow control.
A while back I wrote a system of Windows Services that involved a main process that read its instructions from the database and ran each individual Service as instructed.
I suspect that few newbies are aware that a "service process" can run multiple "service threads" at once -- it's not a 1:1 relationship.
public static void Run(
ServiceBase[] services
)
http://msdn.microsoft.com/en-us/library/6esb073b(v=vs.110).aspx[^]
In this way, I could have the process on server "CAT" run Services "Scratch" and "Purr", while the process on server "DOG" could run Services "Wag" and "Bark" and moving Services from one server to another was simple. All servers had exactly the same code deployed.
|
|
|
|
|
Could you expand the thought on the config file.
Like an ini file stored in App Data of windows?
Best location for a config,
I understand being able to just copy the files over to another server in which I approve of, and quickly install the service and be up and running.
|
|
|
|
|
jkirkerx wrote: Like an ini file
I use XML.
jkirkerx wrote: App Data
That's user-specific. I have used the directory where the application is deployed. And more recently I've been using the C:\ProgramData directory.
|
|
|
|
|
|
jkirkerx wrote: I need some ideas on how to store and pick up stuff like database sql connector, and other stuff.
.Net applications have a "app.config" file which can be added to the application and where one can retrieve and store information.
http://msdn.microsoft.com/en-us/library/ms184658.aspx[^]
Be careful with that file because if you make it ill formed the application will not load and figuring out that problem is difficult.
jkirkerx wrote: I guess the windows app could also start and stop the service as well
A windows service is a windows service, so I am not exactly sure what you mean.
It is possible to structure the build such that one can have a command line executable and a windows service but you probably don't want to try that for your first service.
You might want to also looking into a logging API. Helps in figuring out window service errors.
|
|
|
|
|
Well it dawned on me that I already have a configuration file in the web application that I can adsorb for the database connector string and website name. So I can put the service in the web application. Took me awhile to figure that out.
Perhaps the web application can start the web service, and the service will wait for the date and time to start doing its thing via timer.
So on to my first Windows Service. It's new to me and very frustrating. I just got the base code to work, the framework, so now it
Self Installs
Self Uninstalls
Creates an Event Log
Writes to the Event Log
Connects to the service controller
net start
net stop
net pause
Writes the event log registry entry, and message id file to connect to.
WOW, that was a mind bender. There's help out there, but it's so generic.
Now I know why many said write a console app.
Well now I can go on to writing the job code, and then figure out how to write an id system dll for the event log id's and messages, and register that file.
So I'm going to try reading my config file in the web app first, and see if I can read it, if so I'm on my way to more frustration.
|
|
|
|
|
I am trying to select menu Items if based on url. below is my code and its not working, Please help
Dim strFilePath As String = Me.Context.Request.FilePath
If (strFilePath.Contains(strFilePath.IndexOf("/Groups.aspx").ToString)) = True Then
Menu2.Items(0).Selected = True
ElseIf (strFilePath.Contains(strFilePath.IndexOf("/Reports.aspx").ToString)) = True Then
Menu2.Items(2).Selected = True
Menu2.Items(0).Selected = False
Else : Menu2.Items(0).Selected = False
End If
|
|
|
|
|
IndexOf[^] returns a number. You are checking whether the string contains that number. I think you want to check whether the string contains the substring.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Here is my adjustments but it still not working
Dim strFilePath As String = Me.Context.Request.FilePath
If (strFilePath.Contains("/Groups.aspx")) = True Then
Menu2.Items(0).Enabled = True
ElseIf (strFilePath.Contains("/Reports.aspx")) = True Then
Menu2.Items(2).Enabled = True
Menu2.Items(0).Enabled = False
Else
Menu2.Items(0).Enabled = False
End If
|
|
|
|
|
What does "not working" mean?
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|
|
menu items not getting enabled
|
|
|
|
|
So what happens when you step through the code?
There are only 10 types of people in the world, those who understand binary and those who don't.
|
|
|
|
|
it will go to the correct if to enable the items however Item is not enabled on UI
|
|
|
|
|
Add in some code to set the backgroundcolor of the control you're manipulating; that way you can check easily whether or not you're talking to the correct control, and whether all other code works.
If it does, then there's a chance that the "enabled" property is being reset or overwritten by another part of the code.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
One thing to be aware of. You're doing a case sensitive comparison of a string there. What happens if the case doesn't match what you're testing for (hint, you won't trigger any of your enable conditions)?
|
|
|
|
|
put it in the PreRender funtion
protected void Page_PreRender(object sender, EventArgs e)
{
Menu mymenu = (Menu)Form.FindControl("Menu1");
MenuItem mi = mymenu.FindItem("Programs");
mi.Selected = true;
}
|
|
|
|
|
how can I convert string ('1213,1415') to XML like this:
<planyears>
<planyear>1213</planyear>
<planyear>1415</planyear>
</planyears>
|
|
|
|