0

これは、「HelloWorld」文字列を返すことになっている簡単な例です。ただし、ブラウザには。のようなものが表示されますSGVsbG8gV29ybGQ=。oldskulスタイルのサービスからプレーンテキストを返す正しい方法はどれですか?

それを知ってください:

  1. 文字列を返すことができません。3つのUnicode文字が自動的に先頭に追加され、従来のHTTPクライアントは相互運用できなくなります。

  2. を返すこともできMessageますが、それでもdata変数を抽出するために機能を解析し続ける必要があります。同じメソッドシグニチャでのミキシングMessageintタイプは、AFAIKでは許可されていません。

    [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ただし、これを使用すると、リクエスト(属性)を解析する可能性がなくなります。Messageしたがって、とを統合する方法を知っておくと便利UriRequestです。

PS「クリーンな」統合が不可能な場合-最もエレガントな回避策は何ですか?ワイヤーカーテンの後ろで実行され、実装で借用して使用できるコードはありますか?

4

3 に答える 3

1

これは冗談ではありません。これは、「HelloWorld」(スペース付き)のASCIIバイトのbase64エンコードバージョンです。

Webサービスにバイトの送信を要求すると、base64が使用されます... Webサービスクライアントはbase64デコードを自動的に実行して、元のバイトを取得します。

(使用することはお勧めしませんEncoding.ASCII、気に留めておいてください。)

「レガシーHTTPクライアント」が何であるか、またはそれが何を期待しているのかが明確ではないため、バイト配列を返すことが実際に最良の答えであるかどうかを実際に判断することはできません。

于 2010-09-27T15:31:33.667 に答える
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 に答える
0

SOAP仕様では、生のバイナリデータをbase64でエンコードする必要があると規定されています。したがって、あなたが目撃する行動は正しいです。

ASCII文字データを送信する必要がある場合。1つのメッセージコントラクトと生のメッセージを使用できます。

Message DoIt(DoItRequest request)

生のメッセージは、ASCIIデータを含む応答を作成します。メッセージコントラクトは、指定したintパラメーターを取得するために使用されます。

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

このページでは、Messageクラスの操作方法について説明します。

于 2010-09-28T05:41:06.327 に答える