2011-10-06 50 views
3

我正在爲網站上的「小部件」構建插件體系結構。我希望每個小部件都可以將它的Javascript和CSS作爲資源存儲在程序集中。當頁面呈現時,我注入引用WCF服務的腳本標記,可以檢查該Widget,提取所需的文件,並將其發送回瀏覽器。如何從WCF服務提供CSS文件?

這對JavaScript文件工作正常,但瀏覽器無法處理作爲八位字節流來的CSS文件。通常,您可以在HttpContext中更改響應的內容類型,但這在WCF服務中不可用。

我需要的是讓瀏覽器通過URL檢索這些文件就像這樣:

<link type="text/css" rel="stylesheet" href="/Controllers/WidgetFileService.svc/style/WidgetId"> 

我寧願不實現自定義的IHttpHandler,因爲,在我的經驗,這些可能很難部署,調試,並在不同的機器上工作。這是我在這家公司的第一個項目,我寧願不使部署和測試複雜化。

以下是我對接口:

[ServiceContract]  
public interface IWidgetFileService 
{ 
    [OperationContract] 
    [WebGet(UriTemplate = "style/{widgetID}", BodyStyle = WebMessageBodyStyle.Bare)] 
    System.IO.Stream GetStyleFile(String widgetID); 
} 

和實現:

static private System.IO.Stream StreamBytes(byte[] data) 
{ 
    System.IO.Stream s = new System.IO.MemoryStream(data); 
    s.Position = 0; 
    return s; 
} 

public System.IO.Stream GetStyleFile(String widgetID) 
{ 
    IWidget w = GetWidget(widgetID); 
    return StreamBytes(w.GetEditorStyleFile());    
} 

如果我瀏覽到該URL,數據回來預期。這似乎是瀏覽器處理導致問題的請求的方式。

+0

我想我可以直接將CSS呈現給樣式塊中的頁面,但這並不理想。 –

回答

3

可以使用WebOperationContext以訪問一個WCF服務的傳出響應。我已經驗證過這將它發送給具有指定內容類型的瀏覽器。

public System.IO.Stream GetSytleFile(String widgetID) 
    {    
     IWidget w = GetWidget(widgetID); 
     WebOperationContext.Current.OutgoingResponse.ContentType = "text/css"; 
     return StreamBytes(w.GetEditorStyleFile()); 
    } 
+0

從http://msdn.microsoft.com/en-us/library/ee476510.aspx - 顯式格式 –

0

你太過於複雜的問題。 Css文件是靜態的,應該這樣服務。它在服務器上的速度更快,負載更少,強度更低。

+2

如果我要靜態地提供內容,我將不得不單獨維護所有這些文件。請記住,這是針對插件的,而不是普通的內容。我們需要通過將dll放入目錄來爲本網站添加功能。如果我們開始在網站中包含插件的靜態內容,我們不妨將所有的.cs文件放在那裏,並讓服務器將它們打包。 –

0

這可能是一個哈克的解決方案,但什麼:

<style type="text/css"> 
    @import url("/Controllers/WidgetFileService.svc/style/WidgetId"); 
</style>