2012-08-02 101 views
4

我試圖使用MVC3和IIS URL重寫2從GridFS創建系統以提供圖像及其調整大小的版本。經過測試,我意識到直接提供圖像來自文件系統的速度比使用GridFS文件流服務速度快10倍。然後我決定將原始文件保存在GridFS中,並使用Url Rewrite 2和Asp.Net處理程序的組合,在服務器本地文件系統上創建原始文件和調整版本的副本。在IIS URL中重新處理重寫的URL時出現錯誤重寫2

這裏是重寫規則我使用的服務的原始和調整後的版本:

<rule name="Serve Resized Image" stopProcessing="true"> 
    <match url="images/([a-z]+)/[a-f0-9]+/[a-f0-9]+/[a-f0-9]+/([a-f0-9]+)-([a-f0-9]+)-([a-f0-9]+)-([0-9]+)\.(.+)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="/Handlers/ImageResizer.ashx?Uri={REQUEST_URI}&amp;Type={R:1}&amp;Id={R:2}&amp;Width={R:3}&amp;Height={R:4}&amp;ResizeType={R:5}&amp;Extension={R:6}" appendQueryString="false" logRewrittenUrl="true" /> 
</rule> 
<rule name="Serve Original Image" stopProcessing="true"> 
    <match url="images/([a-z]+)/[a-f0-9]+/[a-f0-9]+/[a-f0-9]+/([a-f0-9]+)\.(.+)" /> 
    <conditions logicalGrouping="MatchAll" trackAllCaptures="false"> 
    <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
    </conditions> 
    <action type="Rewrite" url="/Handlers/Images.ashx?Uri={REQUEST_URI}&amp;Type={R:1}&amp;Id={R:2}&amp;Extension={R:3}" appendQueryString="false" logRewrittenUrl="true" /> 
</rule> 

正如你可以看到,重寫引擎檢查該文件的文件系統中,如果沒有。重寫URL並將請求發送到處理程序。 Handler處理流並將文件寫入文件系統。在下一個請求中,文件直接從文件系統提供。我已經把文件分成了24個字符ID(MongoDB Object ID as string),以避免在同一個文件夾中成千上萬的圖像宕掉。

下面是一個簡單的原始圖像的要求:

http://localhost/images/test/50115c53/1f37e409/4c7ab27d/50115c531f37e4094c7ab27d.jpg

這與調整版本的作品沒有任何問題。

由於這個URL太長並且有重複內容,我決定再次使用重寫引擎來縮短url以自動生成文件夾名稱。下面是我把頂端的規則:

<rule name="Short Path for Images"> 
    <match url="images/([a-z]+)/([a-f0-9]{8})([a-f0-9]{8})([a-f0-9]{8})(.+)" /> 
    <action type="Rewrite" url="images/{R:1}/{R:2}/{R:3}/{R:4}/{R:2}{R:3}{R:4}{R:5}" appendQueryString="false" logRewrittenUrl="true"></action> 
</rule> 

當我要求使用這個法則,例如具有以下網址的圖片:

http://localhost/images/test/50115c531f37e4094c7ab27d.jpg

只供如果圖像的圖像已經在文件系統上,否則我得到以下錯誤:

HTTP Error 500.50 - URL Rewrite Module Error. The page cannot be displayed because an internal server error has occurred.

我已檢查請求的IIS日誌文件條目。它不顯示任何除外細節:

2012-08-02 14:44:51 127.0.0.1 GET /images/test/50115c531f37e4094c7ab27d.jpg - 80 - 127.0.0.1 Mozilla/5.0+(Windows+NT+6.1;+WOW64)+AppleWebKit/537.1+(KHTML,+like+Gecko)+Chrome/21.0.1180.60+Safari/537.1 500 50 161 37

在另一方面,全成請求中記錄改寫網址,如:

GET /Handlers/ImageResizer.ashx Uri=/images/test/50115c53/1f37e409/4c7ab27d/50115c531f37e4094c7ab27d-1f4-1f4-2.jpg&Type=test&Id=50115c531f37e4094c7ab27d&Width=1f4&Height=1f4&ResizeType=2&Extension=jpg

ELMAH和事件日誌也沒有顯示任何東西。將文件系統記錄器添加到我的控制器方法的頂部,並且不會記錄這些特定的有問題的請求。

任何人都可以提出一個解決方法,讓它工作?

編輯:後RuslanY的建議有關Failed Request Tracing,我已經成功地找出錯誤:

ModuleName: RewriteModule 
Notification: 1 
HttpStatus: 500 
HttpReason: URL Rewrite Module Error. 
HttpSubStatus: 50 
ErrorCode: 2147942561 
ConfigExceptionInfo: 
Notification: BEGIN_REQUEST 
ErrorCode: The specified path is invalid. (0x800700a1) 

整個跟蹤結果可以看到here(即只)

不幸的是,這仍然是由於第二個規則(因此縮短規則)在文件系統上存在該文件時正在工作,因此未將我帶入解決方案。

+0

你應該看看在你的IIS日誌('的%SystemDrive%\的Inetpub \日誌\ LogFiles')來找到特定的錯誤。這可能與您的重寫規則有關。或者您正在調用的用於生成圖像的腳本的結果不合適。 – Stennie 2012-08-02 12:24:20

+0

不幸的是,日誌沒有顯示任何東西。 – 2012-08-02 14:51:13

+1

您是否嘗試過檢查是否從IIS失敗的請求跟蹤日誌中獲取有關錯誤的更多詳細信息? http://learn.iis.net/page.aspx/467/using-failed-request-tracing-to-trace-rewrite-rules/ – RuslanY 2012-08-02 17:33:06

回答

2

作爲使用UrlRewrite執行此檢查的替代方法,爲什麼不使用基於磁盤的緩存的應用程序請求路由。將生成動態圖像,ARR的緩存基礎架構將生成的圖像保存到磁盤。更少的混亂,我已經使用ARR在生產場景中獲得巨大成功。磁盤高速緩存在IIS重新啓動之間持續存在,只要您說(默認情況下使用響應中的高速緩存信息,但可以覆蓋此時間更長)就可以存活。

Application Request Routing

+0

看起來很有希望,讓我檢查並回復你,謝謝。 – 2012-08-10 15:06:17

+0

再次感謝,ARR解決了超過我問:) – 2012-08-10 18:18:04

+0

雖然在它,你想看看我的另一個問題[選擇自定義輸出緩存提供程序的特定控制器操作](http://stackoverflow.com/questions/11818528 /選擇定製輸出緩存提供商換特定控制器的動作) – 2012-08-10 18:21:13