1

我有一个自托管的 WCF REST/ webHttpBinding-endpoint-bound 服务。我有几个不同内容类型的流服务。内容本身已正确交付,但任何OutgoingResponse.ContentType设置似乎都被忽略了,而是像"application/xml"每次一样交付。

对于 javascript 和 html(取决于它的使用方式),浏览器似乎可以克服它,但对于解释更严格的 css 文件却没有。CSS 文件是我意识到问题的方式,但它是所有 Streams 的问题。Chromebug 和 IE 开发人员工具都会显示"application/xml",无论我在内容类型的服务代码中添加了什么内容。我也尝试将内容类型标头设置为HeaderinOutgoingResponse但这没有什么区别,而且它可能只是做 OutgoingResponse.ContentType 已经做的很长的路要走。

[OperationBehavior]
System.IO.Stream IContentChannel.Code_js()
{
    WebOperationContext.Current.OutgoingResponse.ContentType = "text/javascript;charset=utf-8";

    var ms = new System.IO.MemoryStream();

    using (var sw = new System.IO.StreamWriter(ms, Encoding.UTF8, 512, true))
    {
        sw.Write(Resources.code_js);
        sw.Flush();
    }

    ms.Position = 0;

    return ms;
}

添加了此行为:

var whb = new WebHttpBehavior
{
    DefaultBodyStyle = System.ServiceModel.Web.WebMessageBodyStyle.WrappedRequest,
    DefaultOutgoingRequestFormat = System.ServiceModel.Web.WebMessageFormat.Json,
    DefaultOutgoingResponseFormat = System.ServiceModel.Web.WebMessageFormat.Json,
    HelpEnabled = false
};

我试过设置AutomaticFormatSelectionEnabled = truefalse以防万一,因为它出现在谷歌搜索中,但这对此没有影响。

我找到了足够多的文章来展示 Stream 和 ContentType 一起工作,这让我很困惑,为什么这不起作用。我相信这Stream只是响应的主体,而不是整个信封。

我的 .svclog 没有显示任何我认识的有趣/相关的内容。

=============

我可以在 Fiddler2 中确认标题正在按浏览器中显示的方式传递。

...
Content-Type: application/xml; charset=utf-8
Server: Microsoft-HTTPAPI/2.0
...
4

1 回答 1

0

解决了!

我在 MessageInspector 中有如下内容:

HttpResponseMessageProperty responseProperty = new HttpResponseMessageProperty(); responseProperty.Headers.Add("Access-Control-Allow-Origin", "*"); reply.Properties["httpResponse"] = responseProperty;

这覆盖了 reply.Properties 中已经存在的 HttpResponseMessageProperty,包括任何 contentType 设置。相反,我首先尝试获取 HttpResponseMessageProperty 并使用现有的(如果找到)。

我很幸运看到了那个。

于 2013-07-15T14:29:18.363 回答