我正在嘗試爲Windows Azure創建一個在啓動時加載自定義EXE的Worker Role項目。我改編自大衛周杰倫的碼頭服務器實例代碼在這裏找到:爲什麼GetEnvironmentVariable()在Windows Azure中爲我的RoleRoot返回錯誤的目錄?
http://blogs.msdn.com/b/dachou/archive/2010/03/21/run-java-with-jetty-in-windows-azure.aspx
使用的Visual Web Developer 2010年,我創建了Visual C#中新的雲項目,並在他的Worker角色類代碼下降如下所示:
namespace WorkerRole1
{
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
string response = "";
string S = "";
try
{
System.IO.StreamReader sr;
string port = RoleEnvironment.CurrentRoleInstance.InstanceEndpoints["HttpIn"].IPEndpoint.Port.ToString();
string roleRoot = Environment.GetEnvironmentVariable("RoleRoot");
S = "roleRoot is: " + roleRoot;
Trace.TraceInformation(S);
// string myAzureAppHome = roleRoot + @"\approot\app";
string myAzureAppHome = System.IO.Path.Combine(roleRoot + @"\", @"approot\");
S = "myAzureAppHome is: " + myAzureAppHome;
Trace.TraceInformation(S);
// string jreHome = roleRoot + @"\approot\app\jre6";
Process proc = new Process();
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
//proc.StartInfo.FileName = String.Format("\"{0}\\bin\\java.exe\"", jreHome);
// proc.StartInfo.Arguments = String.Format("-Djetty.port={0} -Djetty.home=\"{1}\" -jar \"{1}\\start.jar\"", port, myAzureAppHome);
proc.StartInfo.FileName = String.Format("\"{0}\\myAzureAppPRJ.exe\"", myAzureAppHome);
S = "Attempting to run file: " + proc.StartInfo.FileName;
Trace.TraceInformation(S);
proc.EnableRaisingEvents = false;
proc.Start();
sr = proc.StandardOutput;
response = sr.ReadToEnd();
}
catch (Exception ex)
{
response = ex.Message;
Trace.TraceError(response);
}
}
public override bool OnStart()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
return base.OnStart();
}
}
}
問題是我回到RoleRoot的目錄與我在存儲模擬器上運行項目時出現「app」支持文件的位置不匹配。 「應用程序」 文件夾,在這個目錄,我發現通過搜索WindowsAzureProject2目錄樹中結束:
C:\用戶\ mycomp \文檔\ Visual Studio 2010的\項目\ WindowsAzureProject2 \ WorkerRole1 \應用
但GetEnvironmentVariable (「RoleRoot」)將以下報告作爲RoleRoot目錄報告爲由我的Trace語句轉儲:
C:\ Users \ mycomp \ documents \ visual studio 2010 \ Projects \ WindowsAzureProject2 \ WindowsAzureProject2 \ bin \ Debug \ WindowsAzureProject2.csx \角色\ WorkerRole1
哪一個當然會導致文件未找到異常當調用proc.Start()時,因爲自定義EXE文件位於前目錄中,而不是後者。
任何人都可以告訴我爲什麼roleRoot路徑似乎是拙劣的,我能做些什麼來解決這個問題?請注意,我知道EXE之前我的任務分配到proc.StartInfo.FileName(是Visual Web Developer C#與Visual Studio Pro C#不同?),但修復不會改變我遇到的路徑問題的雙反斜槓問題因爲GetEnvironmentVariable(「RoleRoot」)返回的目錄不包含我的「app」目錄。
UPDATE:在做了一些更多的閱讀之後,我發現真正發生的事情是「approot」目錄沒有被創建,我的「app」文件夾文件也沒有被複制。我仍然無法弄清楚爲什麼。
- roschler
謝謝!那樣做了。我加了他們,但顯然默認的屬性設置是「從不復制」。一旦我遵循你的建議,並改變它「總是複製」的一切開始工作。請注意,不能將其設置爲文件夾級別,您必須通過編輯文件級別的屬性來完成此操作。 –