webHttpBinding を使用したサービスから Hello World ではなく意味不明なメッセージが表示される

StackOverflow https://stackoverflow.com/questions/3805330

質問

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

知っておいてください:

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

  2. 返品できます Message, ただし、引き続き機能を解析して抽出する必要があります。 data 変数。混合 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.

追伸 「クリーンな」統合が不可能な場合、最も洗練された回避策は何でしょうか?金網の内側で実行されている、借用して実装に使用できるコードはありますか?

役に立ちましたか?

解決 2

に統合し、人々は私が同じように立ち往生していることが判明する適切な方法のためのグーグル(私はそれで間違っていた場合、私を修正してください)。これまでのところ、以下の回避策は、私のために罰金を動作します:

  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;
        }
  }
より良い代替手段がある場合は、 - 。それはそれについて知って完璧になる。

他のヒント

ちんぷんかんぷんではありません。

- それはASCIIのbase64でエンコードされたバージョンですが(スペースで)「Hello World」のためにバイト

あなたが送信バイトにWebサービスを依頼する場合、それはBASE64を使用する...あなたのWebサービスクライアントを使用すると、オリジナルのバイトを取り戻すために、自動的にデコードBASE64を行います。

(私はあなたを気にし、Encoding.ASCIIを使用することをお勧めしません。)

私たちは本当にバイト配列を返すことは、実際に最良の答えであるかどうかを言うことができないので、それは、どのようなあなたの「レガシーHTTPクライアント」である、または何それは期待していますをクリアしていない。

生のバイナリデータはBase64エンコードされるべきであることを

SOAP仕様状態。行動あなた証人が正しいようにします。

あなたが送信ASCII文字データに必要がある場合。あなたは、1つのメッセージの契約と生のメッセージを使用することができます。

Message DoIt(DoItRequest request)

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

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

このページは、Messageクラスでどのように仕事に説明しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top