2011-10-06 2 views
3

Я работаю над подключаемой архитектурой для «виджетов» на веб-сайте. Я хотел бы, чтобы каждый отдельный виджет хранил его Javascript и CSS в качестве ресурсов в сборке. Когда страница отображается, я добавляю теги сценария, которые ссылаются на службу WCF, которая может проверять виджет, извлекать нужный файл и отправлять его обратно в браузер.Как я могу служить CSS-файлу из службы WCF?

Это отлично работает для файлов 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, и сервер JIT их. –

0

Это может быть Hacky решение, но что:

<style type="text/css"> 
    @import url("/Controllers/WidgetFileService.svc/style/WidgetId"); 
</style> 
Смежные вопросы