12

イメージ/ファイル/etc をバイト配列で返す単純な WCF REST メソッドがあります。

[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
byte[] TestMethod();

webHttpBindingサービス コントラクトは、次の動作で にバインドされます。

<endpointBehaviors>
  <behavior name="webHttpBehavior">
    <webHttp defaultOutgoingResponseFormat="Json" />
  </behavior>
</endpointBehaviors>

バイト配列が次のようにフォーマットされていることを除いて、メソッドは正常に機能します。

[25,15,23,64,6,5,2,33,12,124,221,42,15,64,142,78,3,23]

属性を削除するdefaultOutgoingResponseFormat="Json"と、サービスはデフォルトで XML 形式になり、結果は次のように Base64 でエンコードされます。

GQ8XQAYFAiEMfN0qD0COTgMX

これにより、特にデータが大きくなる場合に、データ転送が節約されます。

JSON 出力形式の Base64 エンコーディングを有効にするにはどうすればよいですか?

4

1 に答える 1

13

数か月前に、当社の Web サービスで同様の問題に直面しました。JSON エンドポイントを使用してバイト配列を送信する方法を理解する必要がありました。残念ながら、簡単な答えはありません。ただし、2 つの回避策を見つけたので、最も簡単な方法を使用することにしました。これらのいずれかが役立つかどうかは、あなたに判断してもらいます。

オプション 1 は、バイト配列ではなく base64 でエンコードされた文字列を返します。

Microsoft の Convert ライブラリは、バイト配列を base 64 文字列に、またはその逆に簡単に変換します。

[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
string TestMethod();

public string TestMethod()
{
    byte[] data = GetData();
    return Convert.ToBase64String(data);
}

あなたのjsonの結果は次のようになります...

{
    "TestMethodResult":"GQ8XQAYFAiEMfN0qD0COTgMX"
}

次に、クライアントはそれをバイト配列に変換できます。クライアントが C# も使用している場合は、次のように簡単です。

byte[] data = Convert.FromBase64String("GQ8XQAYFAiEMfN0qD0COTgMX");

ただし、私たちの場合のように、かなり大きなバイト配列がある場合は、次の方法がより良いオプションになる可能性があります

オプション 2 はストリームを返します。

はい、これはjsonを取得しないことを意味します。基本的には、生データを送信してコンテンツ ヘッダーを設定するだけで、クライアントはそれを解釈する方法を知ることができます。ブラウザに画像を送信するだけだったので、これでうまくいきました。

[OperationContract]
[WebGet(UriTemplate = "TestMethod")]
Stream TestMethod();

public Stream TestMethod()
{
    byte[] data = GetData();
    MemoryStream stream = new MemoryStream(data);
    WebOperationContext.Current.OutgoingResponse.ContentType = "image/jpeg"; //or whatever your mime type is
    stream.Position = 0;
    return stream;
}
于 2012-08-22T02:56:26.633 に答える