如何从WCF服务提供CSS文件?

时间:2011-10-06 16:55:15

标签: c# .net css web-services wcf

我正在为网站上的“小部件”开发一个插件架构。我希望每个小部件都将其Javascript和CSS存储为程序集中的资源。呈现页面时,我会注入引用WCF服务的脚本标记,该服务可以检查窗口小部件,提取所需文件,然后将其发送回浏览器。

这适用于Javascript文件,但浏览器无法处理作为八位字节流传输的CSS文件。通常,您只需在HttpContext中更改响应的内容类型,但这在WCF服务中不可用。

我需要的是让浏览器通过这样的网址检索这些文件:

<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,数据将按预期返回。这似乎是浏览器处理导致问题的请求的方式。

3 个答案:

答案 0 :(得分:3)

您可以使用WebOperationContext访问WCF服务中的传出响应。我已经验证了这会将其发送到具有指定内容类型的浏览器。

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

答案 1 :(得分:0)

你的问题非常复杂。 Css文件是静态的,应该这样提供。它更快,更少负载在服务器上,并具有较少的强制性。

答案 2 :(得分:0)

这可能是一个hacky解决方案,但是呢:

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