我可以想到三个解决方案:
1. Http Module(代码最少但维护最混乱)
假设您在 ASP.Net 中托管您的 WCF,您可以创建一个 Http 模块以将 \r 添加到应用程序中所有响应的末尾。
这可能是 Http 模块的代码。我在这里使用了 'End' 作为后缀,因为它在浏览器中比 \r 更容易阅读,但是对于 \r,您可以将 context_PostRequestHandlerExecute 中的“End”更改为“\r”。
public class SuffixModule : IHttpModule
{
private HttpApplication _context;
public void Init(HttpApplication context)
{
_context = context;
_context.PostRequestHandlerExecute += context_PostRequestHandlerExecute;
}
void context_PostRequestHandlerExecute(object sender, EventArgs e)
{
// write the suffix if there is a body to this request
string contentLengthHeaderValue = _context.Response.Headers["Content-length"];
string suffix = "End";
if (!String.IsNullOrEmpty(contentLengthHeaderValue))
{
// Increase the content-length header by the length of the suffix
_context.Response.Headers["Content-length"] =
(int.Parse(contentLengthHeaderValue) + suffix.Length)
.ToString();
// and write the suffix!
_context.Response.Write(suffix);
}
}
public void Dispose()
{
// haven't worked out if I need to do anything here
}
}
然后你需要在你的 web.config 中设置你的模块。下面假设您的 IIS 在集成管道模式下运行。如果还没有,则需要在 <system.web><httpModules> 部分中注册模块。
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<!-- 'type' should be the fully-qualified name of the type,
followed by a comma and the name of the assembly-->
<add name="SuffixModule" type="WcfService1.SuffixModule,WcfService1"/>
</modules>
</system.webServer>
这个选项的问题是默认情况下会影响应用程序中的所有请求,如果您决定使用分块编码,它可能会失败。
2. 使用ASP.NET MVC(改变技术但可维护性好)
使用 MVC 而不是 WCF。你可以更好地控制你的输出。
3. 自定义序列化器(大量代码,但比选项 1 更简单)
您可以编写自己的自定义序列化程序。这个 StackOverflow 问题为您提供了有关如何执行此操作的指示。我没有为此编写原型,因为它看起来好像有很多很多需要重写的方法。我敢说它们中的大多数将是标准序列化程序的非常简单的委托。