WCF Global Variables in IIS Implementation

To keep this simple, I'm going to pretend that all I want to do is record the number of times my WCF Service is called from a client in a static field called “Hits” and since a IIS hosted WCF service terminates if no requests are made after a period of time, “Hits” will be reset to zero when this happens, losing the data. I don't want each request fetching this data, but just getting it from the static field.

My questions are:
1.      What event can be trapped to read a starting value from a DB when the service starts (not a session start but the actual service start);
2.      How can I make the static field “Hits” threadsafe, since multiple workerthreads for this WCF will all be trying to update this static field;
3.      What event can be trapped, when the service self-terminates, to save the value in “Hits” to the DB.

Thanks
Vic-20Asked:
Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

käµfm³d 👽Commented:
I believe for 1 & 3 you can add a Global.asax file to your WCF project. Within that file you would have access to (for 1) Application_Start and (for 3) Application_End event handlers.

For 2, if you are only writing to variable, the I believe you just need to create a critical section around the call to write. If readers are involved as well, then it gets a bit more tricky.

For write only I believe you could do something like:

private static object SyncObject = new object();

...

lock (SyncObject)
{
    // write to field
}

Open in new window

0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
Vic-20Author Commented:
Thanks for the Globals.asax idea. This works well.
Regarding the static field, I was able to hit the WebService with 300 requests per second from 2 different PC's asynchronously without any errors so I'm wondering if your lock example is needed. Perhaps a static field in IIS/WCF is threadsafe afterall?
0
käµfm³d 👽Commented:
Perhaps a static field in IIS/WCF is threadsafe afterall?
No, static data is not thread safe until you make it that way. But now that I think about it:  if you are only writing to the variable, then I don't think it matters about locking. There is only one operation being applied to the variable, and nothing else is dependent on the field, so locking may not be required. If you later add code in which depends on the current value of the variable, then locking may be required.
0
Vic-20Author Commented:
Perhaps the question is what is the worst that can happen? Is it possible for data corruption to occur if the exact same memory location is updated at the same time by 2 different threads or is the OS preventing that when we get to that level?


This is the code sample btw:
{
  public class Service : IService
  {
    public DSQ.ClientsDataTable GetClients()
    {
      SGlobals.NoOfTimesCalled++;
…..
    }

    public int? NoOfTimesCalled()
    {
      return SGlobals.NoOfTimesCalled;
    }

  }
}
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C#

From novice to tech pro — start learning today.

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.