6

我正在尝试使用 Windows Azure 缓存将会话存储在 MVC4 应用程序中。我按照Link的步骤构建了一个应用程序,但是当我尝试使用下面的代码行创建 DataCache 对象时。

DataCache cache = new DataCache("default");

发生错误:

Microsoft.WindowsAzure.ServiceRuntime.dll 未找到或版本不匹配,我将我的 Windows Azure 模拟器版本更新为 2.0.0 并使用 NuGet 包安装程序安装 WindowsAzure.Caching 包版本 2.0.0.0。现在错误更改为“'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' 的类型初始化程序引发了异常。”

我在用Windows 8 with VS2012 and Windows Azure Emulator version 2.0.0.

如果有人可以帮助我,我将不胜感激。

InnerException
    Message: The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception.

    Source: Microsoft.WindowsAzure.ServiceRuntime

    Stack Trace:    at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsAvailable()
       at Microsoft.ApplicationServer.Caching.AzureClientHelper.RoleUtility.IsAzureEnvironmentAvailable()

Stack Trace:    at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   at System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   at System.Reflection.MethodBase.Invoke(Object obj, Object[] parameters)
   at Microsoft.ApplicationServer.Caching.DataCacheFactoryConfiguration.Initialize(String clientName)
   at Microsoft.ApplicationServer.Caching.DataCacheFactoryConfiguration..ctor()
   at Microsoft.ApplicationServer.Caching.DataCacheFactory..ctor()
   at Microsoft.ApplicationServer.Caching.DataCacheFactory.InitializeOrFetchSingletonFactoryInstance(String clientConfigurationName)
   at Microsoft.ApplicationServer.Caching.DataCache..ctor(String cacheName, String clientConfigurationName)
   at Microsoft.ApplicationServer.Caching.DataCache..ctor(String cacheName)
   at MvcWebRole.Controllers.HomeController.Index() in d:\Pankaj\Azure.Test\Caching.Sample\MvcWebRole\Controllers\HomeController.cs:line 15
   at lambda_method(Closure , ControllerBase , Object[] )
   at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
   at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12()
   at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
4

3 回答 3

2

我在从 Azure SDK 2.3迁移到 SDK 2.4 时遇到了这种情况。

我注意到迁移自动修复了对我的 web 和工作角色的服务运行时的所有引用,即

C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.3\ref\Microsoft.WindowsAzure.ServiceRuntime.dll

变成:

C:\Program Files\Microsoft SDKs\Azure\.NET SDK\v2.4\ref\Microsoft.WindowsAzure.ServiceRuntime.dll

但是,从引用此程序集的 web/worker 角色引用的任何程序集都没有更新,因此我必须手动进行。

此外,我必须更新 web.config 和 app.config 条目以引用 2.4.0.0

<dependentAssembly>
    <assemblyIdentity name="Microsoft.WindowsAzure.ServiceRuntime" publicKeyToken="31bf3856ad364e35" culture="neutral" />
     <bindingRedirect oldVersion="0.0.0.0-2.4.0.0" newVersion="2.4.0.0" />
</dependentAssembly>
于 2014-10-16T09:49:28.800 回答
1

我通过将其添加到 App.config 解决了类似的问题:

<startup useLegacyV2RuntimeActivationPolicy="true">
  <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup>

这是因为,我相信,ServiceRuntime.dll(或其依赖项之一)是一个“混合模式”程序集。关于这意味着什么以及上面的配置行的更多信息可以在这里找到: What does 'useLegacyV2RuntimeActivationPolicy' do in the .NET 4 config?

于 2013-07-25T21:56:50.073 回答
1

我遇到过同样的问题。解决方案是将每个项目中所有引用的 Azure 程序集指向相同的源(对我来说是 SDK 文件夹中的 dll)。NuGetManager 将 dll 复制到主项目路径下packages,并将引用指向这些 dll。

于 2013-06-07T14:57:31.997 回答