0

这是一个应该返回“Hello World”字符串的简单示例。但是,浏览器会显示类似SGVsbG8gV29ybGQ=. 从 oldskul 风格的服务返回纯文本的正确方法是什么?

请知道:

  1. 我无法返回字符串:三个 Unicode 字符将被自动添加到前面,旧的 HTTP 客户端将无法互操作。

  2. 我可以返回 a Message,但仍然必须保持解析功能来提取data变量。AFAIK 不允许在同一方法签名中 混合Message和键入。int

    [ServiceContract(SessionMode=SessionMode.NotAllowed)] 
    public interface IHello 
    {
      [WebGet(UriTemplate = "manager?data={data}")]
      [OperationContract]
      Byte[] DoIt(int data);
    }

    public class Hello : IHello { public Byte[] DoIt(int data) { return Encoding.ASCII.GetBytes("HelloWorld"); } }

更新:这不是乱码,而是正确编码的响应。但是,格式不是我期望收到的。我已经发现(正如下面的先生所建议的那样)传输层消息格式的最终​​控制是通过Message类获得的。但是,如果我确实使用了一个 - 我失去了解析请求(UriTemplate属性)的可能性。因此,很高兴知道如何MessageUriRequest.

PS如果“干净”集成是不可能的 - 那么最优雅的解决方法是什么?请问是否有任何代码可以在我的实现中借用和使用的线幕后面完成?

4

3 回答 3

1

谷歌搜索了一种适当的整合方式,发现人们和我一样被困住了(如果我错了,请纠正我)。到目前为止,以下解决方法对我来说很好:

  public class Hello : IHello
  {
        [WebGet(UriTemplate = "manager")]
        [OperationContract]
        Message DoIt();
  }

  public class Hello : IHello
  {
        public Message DoIt()
        {
          var webContext = WebOperationContext.Current;
          var request = webContext.IncomingRequest;
          var queryParameters = request.UriTemplateMatch.QueryParameters;
          var data = queryParameters["data"];

          var result = new StringBuilder(@"
              <?xml version='1.0'?>
              ...
          ");

          var response = webContext.CreateTextResponse(result.ToString(), "application/xml", Encoding.ASCII);

          return response;
        }
  }

如果有更好的选择 - 了解它将是完美的。

于 2010-09-28T10:16:05.960 回答
1

这不是乱码——它是“Hello World”(带有空格)的 ASCII 字节的 base64 编码版本。

当您要求 Web 服务传输字节时,它将使用 base64...您的 Web 服务客户端将自动执行 base64 解码,以获取原始字节。

(我不建议使用Encoding.ASCII,请注意。)

目前尚不清楚您的“旧 HTTP 客户端”是什么,或者它的预期是什么,因此我们无法真正判断返回字节数组是否实际上是最佳答案。

于 2010-09-27T15:31:33.667 回答
0

SOAP 规范规定原始二进制数据应采用 base64 编码。所以你目睹的行为是正确的。

如果需要传输ASCII字符数据。您可以使用一个消息合约和一个原始消息。

Message DoIt(DoItRequest request)

原始消息将创建包含 ASCII 数据的响应。消息合约用于检索您提到的 int 参数:

[MessageContract]
public class DoItRequest
{
  [MessageBodyMember] public int data;
}

本页解释了如何使用 Message 类。

于 2010-09-28T05:41:06.327 回答