2011-10-06 5 views
3

私は、Webサイト上の「ウィジェット」用のプラグインアーキテクチャに取り組んでいます。私は個々のウィジェットにJavascriptとCSSをリソースとしてアセンブリに格納したいと思います。ページがレンダリングされるときに、WCFサービスを参照するスクリプトタグを挿入して、ウィジェットを検査し、目的のファイルを抽出してブラウザに送り返すことができます。WCFサービスからCSSファイルをどのように配信できますか?

これはJavascriptファイルでは問題なく動作しますが、ブラウザはCSSファイルをオクテットストリームとして処理できません。通常、HttpContextで応答のコンテンツタイプを変更することはできますが、これはWCFサービスでは利用できません。

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

私は、私の経験では、それらはに困難になる可能性があるため、カスタムIHTTPハンドラを実装しないことを好むだろう:私は必要なもの

は、ブラウザがそのようなURLを介してこれらのファイルを取得することですデプロイ、デバッグ、および異なるマシンでの作業を行うことができます。これはこの会社の私の最初のプロジェクトであり、展開とテストを複雑にすることはありません。ここで

は、私がインターフェイスのために持っているものです。

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

と実装:私はURLを参照した場合、予想通り

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());    
} 

、データが戻ってきます。これは、ブラウザが問題の原因となっているリクエストを処理する方法のようです。

+0

私はCSSをスタイルブロックのページに直接レンダリングすることができますが、それは理想的ではありません。 –

答えて

3

あなたはWCFサービスで、発信応答へのアクセスを得るためにWebOperationContextを使用することができます。私は、指定されたコンテンツタイプでブラウザに送信することを確認しました。

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をディレクトリにドロップすることで、このサイトに機能を追加する機能が必要です。 Webサイトにプラグイン用の静的コンテンツを含めることを開始した場合は、そこに含まれる.csファイルもすべて削除し、サーバーでJITを実行することもできます。 –

0

これはハック解決策になるが、何についてのことがあります。

<style type="text/css"> 
    @import url("/Controllers/WidgetFileService.svc/style/WidgetId"); 
</style> 
関連する問題