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

我正在研究网站上“小部件”的插件体系结构.我希望每个单独的小部件都将其Javascript和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,数据将按预期返回.这似乎是浏览器处理引起问题的请求的方式.

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

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

转载注明原文:如何从WCF服务提供CSS文件? - 代码日志