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

标签 c# .net css web-services wcf

我正在为网站上的“小部件”开发插件架构。我希望每个单独的小部件都将其 Javascript 和 CSS 作为资源存储在程序集中。呈现页面时,我注入(inject)引用 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());
    }

关于c# - 如何从 WCF 服务提供 CSS 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7677972/

相关文章:

android - 如何在异步任务中调用 ksoap2?

c# - 突出显示 Asp.net 图表控件系列中的一列

css - 如何根据不同的类更改另一个容器的高度

c# - 自动完成文本框在执行查询时卡住。一定有更好的办法!

c# - 如何使用此代码使我的 i7 处理器达到 100% 使用率(解析 xml 的最快方法)

c# - "Inheriting"创建 ViewModel 时来自多个模型的 DataAnnotations

c# - 编写应用程序以获取或返回退出代码

javascript - 如何使 li (事件)并在单击其父 li 时可见

javascript - 每个部分的不同菜单颜色/

c# - Visual Studio 2022 for Mac 中未命中断点