エミュレーターでローカルに実行されるクラウド サービス Web ロール プロジェクトがありますが、展開すると実行されません。与えられたエラーは次のとおりです。
[ArgumentNullException: Value cannot be null.
Parameter name: connectionString]
Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(String connectionString) in e:\projects\azure-sdk-for-net\microsoft-azure-api\Services\Storage\Lib\Common\CloudStorageAccount.cs:344
Candor.WindowsAzure.Storage.Table.CloudTableProxy`1.GetTable() in c:\Users\micha_000\Documents\GitHub\candor-common\Candor.WindowsAzure\Storage\Table\CloudTableProxy.cs:66
Candor.WindowsAzure.Storage.Table.CloudTableProxy`1.Get(String partitionKey, String rowKey) in c:\Users\micha_000\Documents\GitHub\candor-common\Candor.WindowsAzure\Storage\Table\CloudTableProxy.cs:117
Candor.WindowsAzure.Logging.Common.Table.CloudTableLogger.get_Configuration() +218
Candor.WindowsAzure.Logging.Common.Table.CloudTableLogger.get_IsInfoEnabled() +9
Common.Logging.Factory.AbstractLogger.Info(Object message) in c:\_oss\common-logging\src\Common.Logging.Core\Logging\Factory\AbstractLogger.cs:503
Candor.Configuration.Provider.ProviderCollection`1.SetActiveProvider(T provider) in c:\Users\micha_000\Documents\GitHub\candor-common\Candor\Configuration\Provider\ProviderCollection.cs:169
Candor.Configuration.Provider.ProviderResolver`1.AppendActive(T provider) in c:\Users\micha_000\Documents\GitHub\candor-common\Candor\Configuration\Provider\ProviderResolver.cs:77
SHM.PublicMvcWeb.App_Start.ProviderBootstrapper.InitProviders() in c:\Users\micha_000\Documents\Git-Repos\shm-main\SHM.PublicMvcWeb\App_Start\ProviderBootstrapper.cs:23
SHM.PublicMvcWeb.App_Start.ProviderBootstrapper.PostStartup() in c:\Users\micha_000\Documents\Git-Repos\shm-main\SHM.PublicMvcWeb\App_Start\ProviderBootstrapper.cs:18
関連する行のコードは、github のスタック トレースで確認できます。
https://github.com/michael-lang/candor-common/
CloudTableProxy のエラーにつながる行は次のとおりです。
if (String.IsNullOrWhiteSpace(_connectionName))
throw new InvalidOperationException("The Cloud ConnectionName has not been configured.");
if (_account == null)
_account = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting(_connectionName));
カスタム エラー「The cloud connectionName has not been configured.」がスローされないため、CloudConfigurationManager.GetSetting に渡された _connectionName が null ではないことがわかります。したがって、CloudConfigurationManager は、指定された名前に対して null を返す呼び出しです。この名前はローカルで実行すると値を返すため、クラウド Web ロールにデプロイしたときに値が見つからない理由がわかりません。接続名がタイプミスで入力された場合、ローカルでも機能しません。確かに、使用する接続に名前を付ける私の一般的なログ構成は次のとおりです。
<common>
<logging>
<factoryAdapter type="Candor.WindowsAzure.Logging.Common.Table.CloudTableLoggerFactoryAdapter, Candor.WindowsAzure.Logging.Common">
<arg key="connectionName" value="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" />
</factoryAdapter>
</logging>
</common>
同じ Candor.Common コンポーネントを使用するクラウド サービス Web ロールを使用したまったく異なるソリューションも持っているため、それらが問題であるとは思いません。
同じラップトップを使用して両方のソリューションを開発しているため、どちらも Azure 2.2 Tools バージョンを使用しています。各ソリューションのクラウド サービス プロジェクトのプロパティを調べると、これが確認されます。
すべてのコンポーネントと NuGet パッケージ参照を調べて、ソリューションを通じてバージョンの不一致がないことを確認しました。機能するソリューションと機能しないソリューションの間で、同じコンポーネントが copy-local=true に設定されます。また、バインディング リダイレクトも同じです。これは私の最大の問題でしたが、この接続の問題が発生する前に解決されました。
機能していないサービスの展開構成:
<?xml version="1.0" encoding="utf-8"?>
<ServiceConfiguration serviceName="SHM.AzureService.PublicMvcWeb" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="4" osVersion="*" schemaVersion="2013-10.2.2">
<Role name="SHM.PublicMvcWeb">
<Instances count="1" />
<ConfigurationSettings>
<Setting name="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)" />
<Setting name="DefaultTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)" />
<Setting name="UserTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)" />
<Setting name="UserSaltTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)" />
<Setting name="UserAuditTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)" />
</ConfigurationSettings>
</Role>
</ServiceConfiguration>
また、最近、これらと同じ接続名を Web アプリケーションの appsettings に入れてみました。これは、コードが RoleEnvironment.OnStart の前に実行されていたという 3 年前のコメントへの対応でした。ただし、この試行でも同じエラーが発生します。
試行の様子は次のとおりです。
<appSettings>
<add key="webpages:Version" value="3.0.0.0" />
<add key="webpages:Enabled" value="false" />
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
<add key="Microsoft.WindowsAzure.Plugins.Diagnostics.ConnectionString" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)"/>
<add key="DefaultTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)"/>
<add key="UserTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)"/>
<add key="UserSaltTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)"/>
<add key="UserAuditTableConnection" value="DefaultEndpointsProtocol=https;AccountName=(redacted);AccountKey=(redacted)"/>
</appSettings>
このエラーのコードは、WebActivator 2.0.6 を使用してアプリケーションの起動時に実行されますが、私の作業ソリューションは WebActivator 2.0.4 を使用します。しかし、WebActivator のリリース ノートには、Debug から "Retail" へのコンパイルの変更と、2 つのバージョン間のライセンスの変更のみが示されています。これらの変更は 1 年前のものです。
タイミングが問題だった場合は、エラーの呼び出しの直前に Thread.Sleep(1000) を追加しようとしましたが、どちらも機能しなかったため、削除します。
using System.Threading;
using Candor.Configuration.Provider;
using Candor.Security;
using Candor.Security.Cryptography;
using Candor.Security.Web;
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(StopHarassingMe.PublicMvcWeb.App_Start.ProviderBootstrapper), "PreStartup")]
[assembly: WebActivatorEx.PostApplicationStartMethod(typeof(StopHarassingMe.PublicMvcWeb.App_Start.ProviderBootstrapper), "PostStartup")]
namespace SHM.PublicMvcWeb.App_Start
{
public class ProviderBootstrapper
{
public static void PreStartup()
{
}
public static void PostStartup()
{
Thread.Sleep(1000); //let RoleEnvironment finish startup first or connectionstrings are not available.
InitProviders();
}
private static void InitProviders()
{
ProviderResolver<HashProvider>.Configure()
.AppendActive(new SHA2HashProvider("sha2") { IsObsolete = false, SaltModifier = "" });
}
}
}
これは、機能するソリューションと機能しないソリューションの両方で構成された最初のプロバイダーです。
エラーが発生した Web アプリケーションで使用されたパッケージのリストを次に示します。
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="Candor.Core" version="1.4.1.0" targetFramework="net45" />
<package id="Candor.jQuery.AutoAsync" version="4.0.0.50129" targetFramework="net45" />
<package id="Candor.Security" version="2.4.0.0" targetFramework="net451" />
<package id="Candor.Security.AzureStorageProvider" version="2.3.2.0" targetFramework="net451" />
<package id="Candor.Web.Mvc" version="1.0.3.0" targetFramework="net451" />
<package id="Candor.Web.Mvc.ErrorHandler" version="1.0.0.0" targetFramework="net45" />
<package id="Candor.Web.Mvc.Security" version="2.1.0.0" targetFramework="net45" />
<package id="Candor.WindowsAzure" version="1.3.0.0" targetFramework="net451" />
<package id="Candor.WindowsAzure.Logging.Common" version="1.1.1.0" targetFramework="net451" />
<package id="Common.Logging" version="2.2.0" targetFramework="net45" />
<package id="Common.Logging.Core" version="2.2.0" targetFramework="net45" />
<package id="form2js" version="1.0.0.30224" targetFramework="net45" />
<package id="jQuery" version="2.1.4" targetFramework="net451" />
<package id="jQuery.UI.Combined" version="1.8.20.1" targetFramework="net45" />
<package id="jQuery.Validation" version="1.13.1" targetFramework="net45" />
<package id="MarkdownSharp" version="1.13.0.0" targetFramework="net451" />
<package id="Microsoft.AspNet.Mvc" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.2.3" targetFramework="net451" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.2.3" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.2.3" targetFramework="net45" />
<package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net451" />
<package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net451" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.2.3" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.1.0" targetFramework="net45" />
<package id="Modernizr" version="2.8.3" targetFramework="net45" />
<package id="Newtonsoft.Json" version="6.0.8" targetFramework="net45" />
<package id="Respond" version="1.4.2" targetFramework="net45" />
<package id="RestSharp" version="105.0.1" targetFramework="net451" />
<package id="System.Spatial" version="5.6.0" targetFramework="net451" />
<package id="T4MVC" version="3.7.4" targetFramework="net45" />
<package id="T4MVCExtensions" version="3.7.4" targetFramework="net45" />
<package id="Twilio" version="4.0.3" targetFramework="net451" />
<package id="Twilio.Mvc" version="3.1.15" targetFramework="net451" />
<package id="Twilio.TwiML" version="3.3.6" targetFramework="net451" />
<package id="WebActivatorEx" version="2.0.6" targetFramework="net451" />
<package id="WebGrease" version="1.6.0" targetFramework="net45" />
<package id="WindowsAzure.Storage" version="2.1.0.3" targetFramework="net45" />
</packages>
私の動作するソリューションと動作しないソリューションの間にはパッケージの違いがいくつかありますが、これらがエラーに当てはまるとは思いませんでした。MVC 5.0 から 5.2.3 に、javascript 関連のパッケージをアップグレードし、Candor.WindowsAzure を 1.2.10 から 1.3 にアップグレードしました。関係があるように思えるかもしれませんが、唯一のコード変更は、バッチ更新メソッドの実装を置き換えることでした。
実用的なソリューション プロジェクト パッケージ:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Antlr" version="3.5.0.2" targetFramework="net45" />
<package id="Candor.Core" version="1.4.1.0" targetFramework="net451" />
<package id="Candor.jQuery.AutoAsync" version="3.5.0.40210" targetFramework="net451" />
<package id="Candor.Security" version="2.4.0.0" targetFramework="net451" />
<package id="Candor.Security.AzureStorageProvider" version="2.3.2.0" targetFramework="net451" />
<package id="Candor.Web.Mvc" version="1.0.3.0" targetFramework="net451" />
<package id="Candor.Web.Mvc.ErrorHandler" version="1.0.0.0" targetFramework="net45" />
<package id="Candor.Web.Mvc.Security" version="2.1.0.0" targetFramework="net45" />
<package id="Candor.WindowsAzure" version="1.2.10.0" targetFramework="net451" />
<package id="Candor.WindowsAzure.Logging.Common" version="1.1.1.0" targetFramework="net451" />
<package id="Common.Logging" version="2.2.0" targetFramework="net451" />
<package id="Common.Logging.Core" version="2.2.0" targetFramework="net451" />
<package id="form2js" version="1.0.0.30224" targetFramework="net45" />
<package id="jQuery" version="2.0.3" targetFramework="net45" />
<package id="jQuery.UI.Combined" version="1.10.3" targetFramework="net45" />
<package id="jQuery.Validation" version="1.11.1" targetFramework="net45" />
<package id="MarkdownSharp" version="1.13.0.0" targetFramework="net451" />
<package id="Microsoft.AspNet.Mvc" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Razor" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.Web.Optimization" version="1.1.2" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Client" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.Core" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.HelpPage" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.OData" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebApi.WebHost" version="5.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages.Data" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.AspNet.WebPages.WebData" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.Data.Edm" version="5.6.0" targetFramework="net45" />
<package id="Microsoft.Data.OData" version="5.6.0" targetFramework="net45" />
<package id="Microsoft.jQuery.Unobtrusive.Ajax" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.jQuery.Unobtrusive.Validation" version="3.0.0" targetFramework="net45" />
<package id="Microsoft.Web.Infrastructure" version="1.0.0.0" targetFramework="net45" />
<package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.1.0" targetFramework="net45" />
<package id="Modernizr" version="2.7.1" targetFramework="net45" />
<package id="Newtonsoft.Json" version="5.0.8" targetFramework="net45" />
<package id="SlidesJS" version="3.0.4" targetFramework="net451" />
<package id="System.Spatial" version="5.6.0" targetFramework="net45" />
<package id="T4MVC" version="3.7.4" targetFramework="net45" />
<package id="T4MVCExtensions" version="3.7.4" targetFramework="net45" />
<package id="WebActivatorEx" version="2.0.4" targetFramework="net45" />
<package id="WebGrease" version="1.6.0" targetFramework="net451" />
<package id="WindowsAzure.Storage" version="2.1.0.3" targetFramework="net45" />
</packages>