Using WebMatrix, SimpleMembershipProvider in WCF service and the “This method cannot be called during the application’s pre-start initialization stage” error.

Having made the transition to using MVC architecture for all my new applications I recently came across a situation where I needed to use the WebMatrix membership provider within my WCF services. It wasn’t a trivial process so I thought I would document it here.

So how do you get access to the SimpleMembershipProvider in WCF?

First add the references to the WebMatrix dlls

references

Second add the Web.Config reference in system.web as such

<membership defaultProvider="SimpleMembershipProvider">
  <providers>
    <add
      name="SimpleMembershipProvider"
      type="WebMatrix.WebData.SimpleMembershipProvider, WebMatrix.WebData"
      connectionStringName="MyApplicationConnectionString"
      applicationName="MyApplicationName"
      enablePasswordRetrieval="false"
      enablePasswordReset="true"
      requiresQuestionAndAnswer="false"
      requiresUniqueEmail="true"
      passwordFormat="Hashed" />
  </providers>
</membership>

Making sure you select your defaultProvider as SimpleMembershipProvider.

Lastly make sure the required assemblies are referenced in the web.config system.web.compilation.assemblies section as such.

<compilation debug="true" targetFramework="4.5">
  <assemblies>
    <add assembly="WebMatrix.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    <add assembly="WebMatrix.WebData, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </assemblies>
</compilation>

and at that point you should be able to do this.

SimpleMembershipProvider provider = (SimpleMembershipProvider)System.Web.Security.Membership.Provider;

and use the provider now as you as you normally would i.e. ValidateUser(), ChangePassword() etc…

However at this point I ran into an issue where the following error appeared. “Parser Error Message: This method cannot be called during the application’s pre-start initialization stage.”. The solution to this problem was the following StackOverflow post and adding the these into my appSettings.

<appSettings>
  <add key="autoFormsAuthentication" value="true"/>
</appSettings>

Which successfully fixed the problem and everything worked at that point.

Advertisements

Always use ChannelFactory when referencing WCF services (particularly for Azure)

Given the indeterminate nature of the IP addresses of Azure web roles (There are a number of exceptions to this but in general) you end up in a real pickle if you you use the Service Reference functionality built into Visual Studio that most of us regularly do.

(This thing)

Image

Truthfully, the way the proxy service references have always worked had its flaws despite its convenience.

The problem boils down to two things. First, if you’re correctly using WCF services you should be binding to DataContracts and Interfaces rather than any concrete implementations anyway. Secondly, you’re stuck with hard-coded values that live in your web.config, with what is inherently dynamic and often not known at compile time (ip addresses).

So how do you solve it?

Remarkably simply, it takes the form of the channel factory and provided you have both your datacontracts and your service interfaces referenced you can then do this.

Image

Download the example.