内部で Enterprise Library を利用している WCF サービスを WebRole にホストさせ、デバッグ実行してブラウザからサービスの URL を表示してみたら、無情にも次の画面が表示された。
パスが長すぎるだって?画面下のログを見てみると…
file:///C:/Users/
/AppData/Local/dftmp/s0/deployment(29)/res/deployment(29).WindowsAzureSample.WindowsAzureSample.WebRole.0/aspNetTemp/aspNetTemp/root/e45984bb/9e9327e7/Microsoft.Practices.EnterpriseLibrary.Configuration.Design.DLL をダウンロードしようとしています。
長っ!DLL のパス長っ!
Development Fabric で実行すると、上記フォルダ内にファイルをコピーして、そこから DLL を読み込むみたいだ。dftmp フォルダより下は、デバッグするたびに変わるけど。
このエラーを回避するには、とにかくパスを短くするしかない。かといって、プロジェクト名やサードパーティ製ライブラリの名前を変更するのには抵抗がある…。
ひとまず、海外のブログ*1で見つけた ServiceDefinition.csdef と ServiceConfiguration.cscfg を修正する方法で回避はできた。方法はいたって単純で、ルート要素の name 属性の値を短くしただけ。ここには通常、プロジェクト名が書かれているけど、それを今回は A に書き変えてみた。
ServiceDefinition.csdef
<?xml version="1.0" encoding="utf-8"?> <!-- ServiceDefinition の name 属性を A に変更 --> <ServiceDefinition name="A" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceDefinition"> <WebRole name="WindowsAzureSample.WebRole"> <InputEndpoints> <InputEndpoint name="HttpIn" protocol="http" port="80" /> </InputEndpoints> <ConfigurationSettings> <Setting name="DiagnosticsConnectionString" /> </ConfigurationSettings> </WebRole> <WorkerRole name="WindowsAzureSample.WorkerRole"> <ConfigurationSettings> <Setting name="DiagnosticsConnectionString" /> </ConfigurationSettings> </WorkerRole> </ServiceDefinition>
ServiceConfiguration.cscfg
<?xml version="1.0"?> <!-- ServiceConfiguration の serviceName 属性を A に変更 --> <ServiceConfiguration serviceName="A" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration"> <Role name="WindowsAzureSample.WebRole"> <Instances count="1" /> <ConfigurationSettings> <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" /> </ConfigurationSettings> </Role> <Role name="WindowsAzureSample.WorkerRole"> <Instances count="1" /> <ConfigurationSettings> <Setting name="DiagnosticsConnectionString" value="UseDevelopmentStorage=true" /> </ConfigurationSettings> </Role> </ServiceConfiguration>
追記
さらに調べてみたら、こんな苦し紛れの方法じゃなくて、ちゃんとした回避方法を発見。
- Windows Azure - Resolving "The Path is too long after being fully qualified" Error Message - Cloudy in Seattle - Site Home - MSDN Blogs
Development Fabric 用の環境変数『_CSRUN_STATE_DIRECTORY』を定義して、値に適当なフォルダのパスを入力すればいい。私は C:\Azure にしてみた。
*1:http://geekswithblogs.net/DavidBarrett/archive/2009/10/09/windows-azure-dev-fabric-and-the-pathtoolongexception.aspx