問題描述
Web服務器有多個,訪問網站時隨機指定一個服務器提供訪問服務。
那麼當我們涉及到對數據庫的Select、Update、Delete以及Insert就需要指定一個數據庫了。實現方法完全可以通過設置配置文件來完成。比如:
<appSettings>
<add key="DBTYPE" value="MySQL" />
<add key="MySQL" value="Database=wldb;Data Source=172.16.1.11;User Id=dahong;Password=dh;pooling=false;CharSet=utf8;port=3306" />
</appSettings>
就是令數據庫連接字符串都指向同一個web服務器(或者數據庫服務器)。
但是當我們上傳圖片時,就麻煩了。比如在服務器端接收到圖片後,我是這樣保存的:
//讀取照片
HttpPostedFile file =HttpContext.Current.Request.Files[0];
string fileName = string.Empty;
string ext = string.Empty;//文件後綴名
string filePath = string.Empty;
if (file.ContentLength != 0)
{
<strong>filePath = Context.Server.MapPath("~/photo/");</strong>
fileName = Path.GetFileName(file.FileName);
ext = Path.GetExtension(file.FileName).ToLower();
if (!ext.Equals(".jpg") && !ext.Equals(".gif") && !ext.Equals(".png") && !ext.Equals(".bmp"))
{
Context.Response.Write("{\"count\":\"0\",\"records\":\"照片格式不正確,上傳失敗!\"}");
return;
}
if (file.ContentLength > 10485760)
{
Context.Response.Write("{\"count\":\"0\",\"records\":\"照片大於10M,上傳失敗!\"}");
return;
}
file.SaveAs(filePath + xkzzh + ext);
}
按照我所寫的,這樣圖片會保存到服務器端應用程序下面的photo文件夾下。Here:
這樣的話。。。我要是有多個服務器,圖片就是不是隨機保存到某一臺服務器上,這完全是靠運氣訪問之前的圖片嘛
顯然不合理,那麼我採用和數據庫同樣的訪問方式試試呢?我令
filePath = "http://172.16.1.11/wl/photo/";
是不可以的,SaveAs 會報錯的。SaveAs 方法被配置爲需要根路徑
解決方案
最後同事給出了他們之前的解決方案:在存儲圖片的服務器上將photo設置爲共享。在其他服務器上的應用程序下刪除原有的photo,並建立photo虛擬目錄。
下面是具體做法:
1.設置共享文件夾
在存放圖片的服務器上設置共享文件夾——就是那個photo文件夾
注:當你發佈到網站後出現輸入框要求輸入用戶名密碼時:
那麼,就需要爲共享文件夾添加權限:Everyone的讀寫權限
2.刪除多餘的同名文件夾
3.建立虛擬目錄
在其他服務器上的應用程序下,建立虛擬目錄
需要注意:
1.虛擬目錄的名稱必須和原有名稱一致,例如這裏必須是"photo"
2.物理路徑必須指向圖片服務器下的photo文件夾,必須可訪問
3.必須可訪問可以通過設置身份驗證方式,如下:
這裏的用戶名、密碼都是訪問圖片服務器的用戶名和密碼。比如我這裏就是和遠程登錄的用戶名和密碼一致。
4.設置配置文件
這樣就設置好了,但運行時還是出錯,好像是權限問題。可以通過設置配置文件來解決。在配置文件中加入:
<identity impersonate="true" userName="Administrator" password="mima"/>
5.原有的程序代碼不用修改
總結
OK,可以咯