2016-08-15 10 views
0

ログインメソッドからバイト配列を返さなければならないControllerクラス(C#)があります。私のログイン機能のための私のコントローラクラスのソースコードを以下で見つけてください。ASP.NETのコントローラクラスからbyte []配列を返します

[RoutePrefix("Account")] 
    public class AccountsController : ApiController  
    { 
     [Route("Login")] 
     [HttpPost] 
     public byte[] Login() 
     { 
      byte[] mSessionID = new Session().getmSessionID(); 
      return mSessionID; 
     } 
    } 

はテスト中に、Webサービスは、 "LVpgqWBYkyXX1FlDg95vlA==" としてbase64Encoded文字列値を返します。私は私のWebサービスがJSON応答のバイト配列応答を返すようにしたい。

+0

}

は(入力JSON形式の文字列として-returns)。正しい?デフォルトでは、WebAPIはbyte []をBase64でエンコードされた形式で返します。レスポンスの返信方法は変更できますが、情報をどのように表示したいのですか?それはJSONオブジェクトの16進値の配列でなければなりませんか?それとも、オクテットストリームの応答でなければならないのでしょうか? APIが返すものの例を挙げてください。 –

+0

私はどちらのフォーマットも認識していません。しかし、私が望むフォーマットは以下のようになります:{数字:2,3,4,5,6,7,8,9,10,1,11,12,13,14,15,2,45} ; 。私は、バイト配列自体を返すWebサービスをしたい – cell

答えて

1

あなたはこの形式でレスポンスを取得したい場合:

{ 
    "Numbers": [ 
    2, 
    3, 
    4, 
    5, 
    6, 
    7, 
    8, 
    9, 
    10, 
    1, 
    11, 
    12, 
    13, 
    14, 
    15, 
    2, 
    45 
    ] 
} 

解決方法1:JSONフォーマッタ

あなたはJSONでシリアライズされていること方法を変更する必要があります。 WebAPIは、WebAPIレスポンスをJSON形式でフォーマットするためにJSON.Netを使用します。

public class ByteArrayFormatter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(byte[]); 
    } 
    public override bool CanRead 
    { 
     get 
     { 
      return false; 
     } 
    } 
    public override bool CanWrite 
    { 
     get 
     { 
      return true; 
     } 
    } 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var byteArray = (byte[])value; 
     writer.WriteStartArray(); 
     if (byteArray != null && byteArray.Length > 0) 
     { 
      foreach (var b in byteArray) 
      { 
       writer.WriteValue(b); 
      } 
     } 
     writer.WriteEndArray(); 
    } 
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Global.asax.csApplication_Start方法(ALL byte[]タイプは、このように直列化されることに注意)でグローバルにフォーマッタを登録するカスタムフォーマッタを作成します。私たちは、次のようにバイト[]フォーマッタをオーバーライドすることができます

0:あなたのJSON応答が Numbers性質を持つように ​​

モデルを作成します。

は、このモデルを使用するようにコントローラを変更します。

​​

解決方法2:迅速かつ汚い

あなたがオブジェクト(モデル)を返す必要があります。

NumbersModelInt.cs(INT []型に気づく)

public class NumbersModelInt 
{ 
    public int[] Numbers { get; set; } 
} 

次に、あなたが応答でint型へのあなたのバイト配列であなたのバイトの全てをキャストする必要があります。

[Route("Login")] 
[HttpPost] 
public byte[] Login() 
{ 
    byte[] mSessionID = new Session().getmSessionID(); 
    return new NumbersModelInt 
    { 
     Numbers = mSessionID.Select(b => (int) b).ToArray() 
    }; 
} 
+0

ありがとう..私はそれらを試してみましょう.. – cell

+0

問題はありません。私はそれがどのように行くのか教えてください –

+0

おかげでJoao ..私は最初のオプションを試してみると、それは完璧にうまくいく..ありがとう、私はしばらくの間これに苦労していたとC#私はそれに新しいです..)乾杯... – cell

0

が私に答えます2番目の質問。 (コントローラのメソッドにJSONオブジェクトを渡す)

私は同僚から助けを得て、適切なリンクを見つけることができました。

https://weblog.west-wind.com/posts/2013/dec/13/accepting-raw-request-body-content-with-aspnet-web-apiは....

は、コードの変更は、私はこの問題を修正するために行われる

タスクログイン(){ 文字列入力= Request.Content.ReadAsStringAsync()を待つ非同期公衆。動的データ= Newtonsoft.Json.Linq.JObject。解析(入力); ( - JSONオブジェクトを返すデータ)を使用すると、ASP.NET 5 WEBAPI以下を使用しているように見え

+0

CanConvertメソッドでByteArrayFormatter.csからsbyte []を返すことはできますか – cell

関連する問題