読者です 読者をやめる 読者になる 読者になる

DevelopmentFabricに「パスが長すぎ」って怒られたときの対処法

内部で Enterprise Library を利用している WCF サービスを WebRole にホストさせ、デバッグ実行してブラウザからサービスの URL を表示してみたら、無情にも次の画面が表示された。

f:id:griefworker:20100402122018p:image

パスが長すぎるだって?画面下のログを見てみると…

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>

追記

さらに調べてみたら、こんな苦し紛れの方法じゃなくて、ちゃんとした回避方法を発見。

Development Fabric 用の環境変数『_CSRUN_STATE_DIRECTORY』を定義して、値に適当なフォルダのパスを入力すればいい。私は C:\Azure にしてみた。

*1:http://geekswithblogs.net/DavidBarrett/archive/2009/10/09/windows-azure-dev-fabric-and-the-pathtoolongexception.aspx