HttpClient.PostAsyncを使用して、OracleConnectionとOracleTransactionを引数に持つAPIを作成したい

実現したいこと

タイトルの通り、HttpClient.PostAsyncを使用して、OracleConnectionとOracleTransactionを引数に持つAPIを作成したいと考えています。

発生している問題・分からないこと

OracleConnection
・JsonConvert.DeserializeObject<OracleConnection>(connection);を行った際、connectionを確認すると、「ServerVersion」が「conn.ServerVersion' は型 'System.InvalidOperationException' の例外をスローしました」となってしまう。
・上記の状態で、SQLの実行を行うと、「この操作用に接続がオープンしている必要があります」とcatchされる。
・再度Open()を行うと、「ServiceNameプロパティが設定されている場合、PDBNameプロパティを設定する必要があります」となる。(PDBNameプロパティはSerializeObjectを行う前からnull)

OracleTransaction
・JsonConvert.DeserializeObject<OracleTransaction>(connection);を行うと例外が発生する。

該当のソースコード

C#

1private HttpClient _client = null;2 3//メイン処理4void Main(HttpClient httpClient)5{6 this._client = httpClient;7 8 //DB接続9 //作成した接続用のメソッドを使用して接続10 OracleConnection conn = this.OpenDB();11 12 //接続できた場合13 if(conn != null)14 {15 try 16 {17 //行ロック・情報取得を行うための情報を取得18 //長くなるので省略(dataに値をセット)19 20 //トランザクション開始21 using(OracleTransaction transaction = conn.BeginTransaction(IsolationLevel.ReadCommitted))22 {23 bool error = false;24 25 //行ロック・情報取得26 //今回質問したい部分27 if(this.RowLock(conn, transaction, data) != true)28 {29 //ログ出力30 }31 32 //取得した情報を使用した処理33 //長くなるので省略(エラーが発生した場合、error = true)34 35 //エラーでない場合、更新し、コミット36 if(error == false)37 {38 //更新39 if(this.UpdateData(conn, transaction, data) != true)40 {41 //ログ出力42 }43 44 //Commit45 transaction.Commit();46 }47 }48 }49 catch(Exception e)50 {51 //ログ出力52 }53 finally 54 {55 //DBを閉じる56 this.CloseDB(conn);57 }58 }59 //DB接続できなかった場合60 else61 {62 //ログ出力63 }64}

C#

1//行ロック・情報取得2private bool RowLock(OracleConnection conn, OracleTransaction transaction, SyukkoDenpyoData data)3{4 try 5 {6 DateTime hizuke = (DateTime)data.datetime;7 8 var parameters = new Dictionary<string, string>()9 {10 { "connection", JsonConvert.SerializeObject(conn) },11 { "transaction", transaction.ToString() },12 { "no", data.no.ToString() },13 { "datetime", hizuke.ToString("yyyy/MM/dd HH:mm:ss") },14 };15 16 var content = new FormUrlEncodedContent(parameters);17 18 var response = this._client.PostAsync(”実際のURL/RowLockApi”, content).Result;19 20 //以下省略21 22 }23 catch(Exception e)24 {25 throw e;26 }27}

C#

1//API2[HttpPost]3public ActionResult RowLockApi(string connection, OracleTransaction transaction, Item item)4{5 OracleConnection conn = JsonConvert.DeserializeObject<OracleConnection>(connection);6 7 try 8 {9 //行ロック・情報取得10 if(this.RowLock(conn, transaction, item) == false)11 {12 throw new Exception("error");13 }14 15 //戻り値を生成16 object obj = new 17 {18 status = 0,19 message = "ok"20 };21 22 return Json(obj, JsonRequestBehavior.AllowGet);23 }24 catch(Exception e)25 {26 //ログ出力27 28 object obj = new 29 {30 status = -1,31 message = "error"32 };33 34 return Json(obj, JsonRequestBehavior.AllowGet);35 }36}

試したこと・調べたこと

上記の詳細・結果

・行ロック・情報取得内で{ "transaction", JsonConvert.SerializeObject(transaction) },、APIでJsonConvert.DeserializeObject<OracleTransaction>(transaction);も試したが、正しい形に戻すことができなかった。
・OracleConnection, OracleTransactionを必要とする処理を、APIではなく同クラス内のメソッドにしたところ、理想通りの動きをした。

補足

Visual Studio 2019
.NET Framework 4.7.2
Newtonsoft.Json 12.0.2

コメントを投稿

0 コメント