2017-09-18 17 views
-1

に更新するときの私は、ユーザーの写真を更新するためのREST APIを構築するためにC#を使用しています:値はnullにはできません。パラメータ名:SQL Serverの

[Route("api/ce/updateFoto")] 
    [HttpPut] 
    [ActionName("updateFoto")] 
    public string updateFoto(int id, [FromBody] string photo) 
    { 
     SqlCommand cmd = new SqlCommand(); 
     System.Data.DataSet ds = new System.Data.DataSet(); 

     try 
     { 
      JObject jObject = JObject.Parse(photo); 
      JToken jUser = jObject["user"]; 
      string photoString = (string) jUser["photo"]; 
      cnn.myConnection.Open(); 
      cmd.Connection = cnn.myConnection; 
      cmd.CommandType = System.Data.CommandType.Text; 
      cmd.CommandText = "update user set photo = convert(VARBINARY(max), '"+ photoString +"') where id=" + id; 

      cmd.ExecuteNonQuery(); 
     } 
     catch (Exception ex) 
     { 
      return ex.Message; 
     } 
     finally 
     { 
      cnn.myConnection.Close(); 
     } 
     return "ok"; 
    } 

とフロントエンドとして、私が呼び出すための角度4.私のコードを使用していますAPI:

URL = 'http://SERVER/Project/api/ce/updateFoto?id='; 

    SavePhoto(userAsJsonString: string, id: string) { 
     return this.http.put(this.URL + id, userAsJsonString, this.options) 
    .map((res: Response) => { 
     res.json(); 
    }); 

httpPut応答200 OKリターンを更新しますが、写真が更新されていない、と私はこの応答を取得しています:

応答{_body: "" バリューキャンあなたはnullになります。\ r \ nパラメータ名:s ""、ステータス:200、ok:}

私を助けることができる人はいますか?私はそれを取得していないよ!私はputの代わりにリクエストを試みましたが、写真の文字列が長すぎます!だから私は身体とput要求を実装する必要があります。

+0

APIをデバッグしましたか?あなたはその側でファイルを受け取りますか? – mok

+0

いいえ、実際にはわかりませんが、jsonがapiでうまくいっています –

+0

アクションメソッドの最初の行にブレークポイントを追加し、その値が表示されているかどうかを確認してください。 (F9キーを使用して)ブレークポイントをトリガーします。そして明らかにあなたはAPIをデバッグすべきです(実行されません)。 – mok

答えて

0

cnncnn.myConnectionとは何ですか?これはグローバルな静的な接続ですか?もしそうなら、それを取り除き、必要なたびに新しい接続インスタンスを作成してください。接続プーリングはすでにフレームワークによって処理されているため、新しい管理接続の作成は比較的安価です。

クライアント側コードにはuserAsJsonStringという値はありますか? jsonオブジェクトを投稿していますか?その場合は、一致するC#モデルクラスを作成し、文字列ではなく着信メソッドの引数として使用する必要があります。

パラメータを使用する必要があります。入力値に文字列連結を使用しないでください。これを行わないと、コードがSQLインジェクション攻撃に開放されます。パラメータを使用するとコードを読みやすくなり、SQL Serverで実行計画を再利用できるようになり、エスケープされていない文字列値によるバグを防ぐことができます。

cmd.CommandText = "update user set photo = @photo where id= @id"; 
// convert photo to a byte array 
// I am not sure what the string is being sent, perhaps its base64 or hex or something else? 
cmd.Parameters.Add(new SqlParameter("@photo", SqlDbType.VarBinary, -1){Value = photoByteArray}); 
cmd.Parameters.Add(new SqlParameter("@id", SqlDbType.Int){Value = id}); 

エラーが発生した場合は、Web APIコードにステータス200が返されません。 stringを返さずに、Webアプリがある場合はIHttpActionResultを返し、MVCを使用している場合はResponse.StatusCodeを変更してください。ステータス200は、Web APIで動作していたすべてのことを意味しますが、例外の場合、これは真実ではありません。返されるステータスは、何が起こったかによって異なります。適切なものを選択してください。http status code

最後に、例外からすべての適切な情報が失われています。タイプ、メッセージ、スタックトレースなどのすべてを記録します。再帰的に内部例外に対してこれを繰り返します。

関連する問題