0

我有一个安静的 Web 服务,它返回如下结果:

<string xmlns="http://schemas.microsoft.com/2003/10/Serialization/">Some Text</string> 

但是,接收端的人需要使用特殊字符终止此文本,例如“\r”。如何将该文本添加到序列化响应的末尾?

我从 C# 中的 WCF 服务内部发送此响应,如下所示:

[WebGet(UriTemplate = "/MyMethod?x={myId}"), OperationContract]
string GetSomeText(Guid myId);
4

1 回答 1

0

我可以想到三个解决方案:

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 问题为您提供了有关如何执行此操作的指示。我没有为此编写原型,因为它看起来好像有很多很多需要重写的方法。我敢说它们中的大多数将是标准序列化程序的非常简单的委托。

于 2013-07-27T08:57:02.767 回答