2009-06-26 105 views
0

我的瀏覽器出現問題,無法識別我在響應中發送的內容類型,並嘗試下載文件而不是顯示它。瀏覽器無法正確識別內容類型標題

我有一個通用的處理程序(名爲SPARQL.ashx)寫在ASP.Net中,它做了一些工作,併產生了兩種可能類型的對象。它可以獲得SPARQLResultSet或圖形,然後在使用適當的Save方法將內容發送給用戶之前設置適當的內容類型。代碼片段如下:

//Execute the Query 
    Object result = store.ExecuteQuery(sparqlquery); 

    if (result is SPARQLResultSet) 
    { 
     //Return as SPARQL Results XML Format 
     context.Response.ContentType = MIMETypesHelper.SPARQL[0]; 
     SPARQLResultSet resultset = (SPARQLResultSet)result; 
     resultset.Save(new StreamWriter(context.Response.OutputStream)); 
    } 
    else if (result is Graph) 
    { 
     //Return as Turtle 
     context.Response.ContentType = MIMETypesHelper.Turtle[0]; 
     Graph g = (Graph)result; 
     TurtleWriter ttlwriter = new TurtleWriter(); 
     ttlwriter.PrettyPrintMode = true; 
     ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream)); 
    } 

我的問題是,我的瀏覽器通常會提示下載結果,而不是儘管一個格式基於XML和基於其他純文本顯示它們,因此都應該顯示在任何現代瀏覽器中。

行爲因瀏覽器而異,有些會提示下載,無論結果格式如何,有些會爲一個而不是另一個。

我可能需要以某種方式配置IIS以確保發送正確的MIME類型。爲了記錄,我有在IIS中註冊的官方文件擴展名和MIME類型。或者這是我使用通用處理程序的問題?還是有人有任何其他想法,爲什麼這可能會發生?

編輯

增加從MIMETypesHelper類代碼爲清楚起見

/// <summary> 
/// Helper Class containing arrays of MIME Types for the various RDF Concrete Syntaxes 
/// </summary> 
/// <remarks>The first type in each array is the canonical type that should be used</remarks> 
public class MIMETypesHelper 
{ 
    /// <summary> 
    /// MIME Types for Turtle 
    /// </summary> 
    public static string[] Turtle = { "text/turtle", "application/x-turtle", "application/turtle" }; 

    /// <summary> 
    /// MIME Types for RDF/XML 
    /// </summary> 
    public static string[] RDFXML = { "application/rdf+xml" }; 

    /// <summary> 
    /// MIME Types for Notation 3 
    /// </summary> 
    public static string[] Notation3 = { "text/n3", "text/rdf+n3" }; 

    /// <summary> 
    /// MIME Types for NTriples 
    /// </summary> 
    public static string[] NTriples = { "text/plain" }; 

    /// <summary> 
    /// MIME Types for SPARQL Result Sets 
    /// </summary> 
    public static string[] SPARQL = { "application/sparql-results+xml" }; 

    ///etc. 
} 
+0

發佈從您的服務返回的確切HTTP標頭可能會有幫助。在Fiddler(www.fiddler2.com)中,只需右鍵單擊該會話,然後選擇複製>標題。 – EricLaw 2009-06-29 21:42:50

回答

0

終於找到了問題的根源,似乎你必須調用的響應清除(),並使用緩衝或內容類型標題不會發送預期:

如。

//Return as Turtle 
context.Response.ContentType = MIMETypesHelper.Turtle[0]; 

//Clear any other output from this Response 
//Then use buffering 
context.Response.Clear(); 
context.Response.BufferOutput = true; 

//Write the Output 
Graph g = (Graph)result; 
TurtleWriter ttlwriter = new TurtleWriter(); 
ttlwriter.PrettyPrintMode = true; 
ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream)); 
1

什麼的Content-Dispostion頭設置?它應該設置爲「內聯」。您可能需要嘗試手動設置以查看行爲是否發生變化。

2

從你的代碼看來,你依賴於rdf庫中的mimetypes(你不會說哪一個)。當瀏覽器如firefox/IE(你不會說你正在使用哪一種)看到一個MIME類型application/SOMETHING它通常提供保存它而不是查看它。

RDF/XML的MIME類型是application/rdf+xml(我知道,因爲我寫了規範),這將導致保存方式。龜的MIME類型(我在Turtle note中創建)未註冊,但建議爲text/turtle,應顯示正常。

+0

該庫被稱爲dotNetRDF,它是我自己的RDF實現(仍然是alpha版本前的版本),所以我非常熟悉你所包含的所有RDF規範。 MIME類型助手類有一組數組,其中包含用於不同RDF語法的公認MIME類型,兩個數組中的第一項(代碼中引用)是該語法的最標準類型。 行爲因瀏覽器和個人電腦而異,我開發機器上的FF顯示SPARQL結果,但在家用機器同時顯示兩者時下載海龜。 IE/Chrome/Safari在行爲上都表現出類似的不一致。 – RobV 2009-06-29 20:21:27

+0

我不確定這是否有一個很好的答案,但@tvanfosson有另一個有用的建議 - 內容處置http://www.ietf.org/rfc/rfc2183.txt我似乎記得IE瀏覽器可能會使用。 – dajobe 2009-07-03 00:41:30

0

在我們的RDF存儲引擎系列中,我們通過內容協商來解決這個問題。

也就是說,我們檢查HTTP請求標頭中的Accept行,並相應地調整我們的行爲。如果Accept行顯式提及任何RDF風格或SPARQL結果MIME類型,那麼我們會發回適當的Content-type和相關聯的響應。這爲我們的體驗提供了專用的SPARQL客戶端,手動代碼和各種RDF「瀏覽器」工具。

但是對於典型的Web瀏覽器,Accept行只是列出了HTML和一些圖像格式,而我們的HTTP守護程序將Content-type設置爲text/plain(或者對於空白SPARQL查詢,text/html, body是一個網頁,帶有一個表單,用於編寫用於測試的Web瀏覽器的手動查詢)

最後,如果Accept標題完全丟失,我們知道這是一個非常天真的軟件,很可能是某人的Perl腳本或其他東西,我們有一個特殊的例子可以讓人們在與存儲引擎進行開發時更輕鬆。