37
votes

I have an ASP.NET MVC4 project which compiles fine in VS2010. For deployment purposes I run a Nant script which attempts to precompile the website using aspnet_compiler.exe but I keep running into an assembly reference issue with System.Web.WebPage

error CS1705: Assembly 'System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' uses 'System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' which has a higher version than referenced assembly 'System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'

I also have the following assembly bindings in my web.config:

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
        <dependentAssembly>
            <assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

and my csproj has the following reference:

<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
  <Private>True</Private>
 <HintPath>..\packages\AspNetWebPages.Core.2.0.20126.16343\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
11

11 Answers

39
votes

I solved this problem by explicitly referencing the 2.0 assembly in Web.config. I suppose that for some reason, the ASP.NET compiler (in my case when running MvcBuildViews), uses the old 1.0 assembly first, if it is found.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- … -->
  <system.web>
    <!-- … -->
    <compilation debug="true" targetFramework="4.0">
      <assemblies>
        <add assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
        <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
        <add assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
      </assemblies>
    </compilation>
    <!-- … -->
  </system.web>
  <!-- … -->
</configuration>

BTW: It looked like this problem occurred for the first time after I added a 3rd party ASP.NET MVC 3.0 component. That component works fine through the assembly binding, but it may be the reason why the ASP.NET compiler tries to load the 1.0 web pages first.

8
votes

We had similar problem.

We are now using Visual Studio 2012 for developing and when we converted a 2010 project to 2012 and tried to deploy that, ASP.NET was requiring 2.0.0.0 instead of 1.0.0.0.

After some investigation I saw that the project was not referencing a specific version of System.Web.WebPages, so after upgrading to VS 2012 it was finding the 2.0.0.0 version.

If you remove the reference from your project and then re-add the specific version from the GAC, it works correctly.

3
votes

For us, the problem was an old copy of the relevant DLL in the _bin_deployableAssemblies folder. Deleting this got us correctly configured with the 2.0 version.

2
votes

This error also occurs for me when MvcBuildViews is set to true.

I noticed that I would always get this error when building the entire solution using 'Build Solution'. At that point, if I immediately built the MVC project by itself (right click on the project then Build), the MVC project would build successfully.

It seems that building the MVC project by itself would succeed as long as it does not trigger builds on its depended projects (ie. they are up-to-date). But building using 'Build Solution' always fails with this error.

2
votes

I experienced this problem when upgrading a site from MVC 3 to 5.2.3.0.

My issue was TFS not adding the packages and associated DLL's from the nuget installation.

I manually added the following folders in the packages folder of the solution.

Microsoft.AspNet.Razor.3.2.3
Microsoft.AspNet.WebPages.3.2.3

Microsoft.Web.Infrastructure.1.0.0.0

Once comitted the build server no longer had the issue.

1
votes

For me it was a reference to System.Web.WebPages.Administration v1.0.0.0 who was the culprit. Once removed, all worked without any Web.config tweaks.

1
votes

I scratched my head for a while over this problem when I had it. Eventually I noticed that I had the following section in the "runtime" section of my web.config.

<runtime>
 . . .
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
      </dependentAssembly>
. . .
</runtime>

As you can see, this refers to version 2 of the assembly, which doesn't match the following code that you also have in the system.web/compilation/assemblies section of web.config.

<add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

The actual assembly referenced in References for the project is indeed v1.0.0.0, so I changed the first chunk of code above to the following, which fixed the problem immediately. I'm not sure how the mistake got there in the first place.

<runtime>
 . . .
      <dependentAssembly>
        <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
      </dependentAssembly>
. . .
</runtime>
0
votes

In such a case, it's worth doing a 'Find in Files' across all files in your solution's root folder.

For the example above, I'd have searched for: System.Web.WebPages, Version=1.0.0.0

In this way you can get rid of all references to the old version.

0
votes

For me this issue was most likely caused buy updating to the latest version of .NET via the Web Platform installer but I did not have the latest version of ASP.NET MVC installed. Updating this Via the Web Platform installer fixed the issues.

0
votes

just go to references and search for System.Web.Mvc version 4.0 or more and add it. I just add a reference of System.web.mvc 4.0.0.1 and it works.

Don't forget to remove older mvc version.

0
votes

Deleting and Re-Adding the Reference System.Web.Mvc Did the job for me