【问题标题】:How can I serve a CSS file from a WCF Service?如何从 WCF 服务提供 CSS 文件?
【发布时间】:2011-10-06 16:55:15
【问题描述】:

我正在为网站上的“小部件”开发插件架构。我希望每个单独的小部件都将其 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,数据会按预期返回。这似乎是导致问题的浏览器处理请求的方式。

【问题讨论】:

  • 我想我可以直接将 CSS 渲染到样式块中的页面,但这并不理想。

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


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

你把问题复杂化了。 Css 文件是静态的,应该这样提供。它速度更快,服务器负载更小,复杂性更小。

【讨论】:

  • 如果我要静态地提供内容,我将不得不单独维护所有这些文件。请记住,这是针对插件的,而不是普通内容。我们需要能够通过将 dll 放入目录中来向该站点添加功能。如果我们开始在网站中包含插件的静态内容,我们不妨也将所有 .cs 文件也放入其中,并让服务器对它们进行 JIT。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 2021-10-31
    • 2013-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    相关资源
    最近更新 更多