Luke Vo
Luke Vo

Reputation: 20738

Exception on accessing a class in Web API

I am encountering a weird behavior. My Web API suddenly cannot be used because of this exception:

[ArgumentNullException: Value cannot be null.
Parameter name: String]
   System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +14198596
   System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) +177
   Dota2IoT.Server.Models.ViewModels.NatMappingManager..cctor() +112

[TypeInitializationException: The type initializer for 'Dota2IoT.Server.Models.ViewModels.NatMappingManager' threw an exception.]
   Dota2IoT.Server.MvcApplication.Application_Start() +223

And this is the constructor of NapMappingManager:

    private ConcurrentDictionary<int, NatMappingViewModel> mappings;

    private NatMappingManager()
    {
        this.mappings = new ConcurrentDictionary<int, NatMappingViewModel>();
    }

Previously, I didn't even call NapMappingManager from the Global.asax Application_Start, but I think it may be because of some concurrent. However, now I try to call:

// Initialize the NAT
Models.ViewModels.NatMappingManager.Instance.ToString()

So the constructor can be called, but the same error happens. What's wrong with it? Did I do something with the code, or a bug from ConcurrentDictionary?

EDIT: The exception does not happen on my local machine. It only happens on my Azure VM (Window Server 2012) server.

EDIT to clarify for the correct answer:

This is the code that causes the problem (I do not have explicit static constructor):

    private static readonly int MaxDeviceNumber = int.Parse(ConfigurationManager.AppSettings["MaxDeviceNumber"]);
    private static readonly int MinDeviceNumber = int.Parse(ConfigurationManager.AppSettings["MinDeviceNumber"]);

Upvotes: 1

Views: 65

Answers (1)

Dave Cousineau
Dave Cousineau

Reputation: 13198

.cctor is the static constructor. This fits with the fact that you have a type initializer exception. It looks like you are trying to parse an int in the static constructor of NatMappingManager, but the value you are passing to it is null.

(If you don't have an explicit static constructor, look for a static member that is being initialized on the same line that it is declared.)

Upvotes: 2

Related Questions