data-api-builder icon indicating copy to clipboard operation
data-api-builder copied to clipboard

[Bug]: Multiple REST API requests fail when "set-session-context": true

Open thinh-ngu opened this issue 1 year ago • 1 comments

What happened?

When requesting for multiple api requests when session context is "set-session-context": true. This is for using DB Type: DWSQL for using against Fabric SQL endpoints.

It causes the following api response:

{ "error": { "code": "DatabaseOperationFailed", "message": "Cannot set key 'aud' in the session context. The key has been set as read_only for this session.", "status": 500 } }

I am assuming the session is being sticky and not starting new sessions for each call. For some reason it may be caching the session when "set-session-context": true, but from my understanding that should default to false.

Version

0.11.130

What database are you using?

Azure SQL

What hosting model are you using?

Container Apps

Which API approach are you accessing DAB through?

REST

Relevant log output

fail: Azure.DataApiBuilder.Service.Controllers.RestController[0]
      7c081014-1d46-44a5-ac17-d5a9e7532d8c Error handling REST request.
      Azure.DataApiBuilder.Service.Exceptions.DataApiBuilderException: Cannot set key 'aud' in the session context. The key has been set as read_only for this session.
       ---> Microsoft.Data.SqlClient.SqlException (0x80131904): Cannot set key 'aud' in the session context. The key has been set as read_only for this session.
         at Microsoft.Data.SqlClient.SqlCommand.<>c.<ExecuteDbDataReaderAsync>b__211_0(Task`1 result)
         at System.Threading.Tasks.ContinuationResultTaskFromResultTask`2.InnerInvoke()
         at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
      --- End of stack trace from previous location ---
         at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
      --- End of stack trace from previous location ---
         at Azure.DataApiBuilder.Core.Resolvers.QueryExecutor`1.ExecuteQueryAgainstDbAsync[TResult](TConnection conn, String sqltext, IDictionary`2 parameters, Func`3 dataReaderHandler, HttpContext httpContext, String dataSourceName, List`1 args)
      ClientConnectionId:72047e37-8ca4-4d5c-9947-ebd8551d6518
      Error Number:15664,State:1,Class:16
      ClientConnectionId before routing:7783f539-dec7-4b05-810f-4a560d0de35b
      Routing Destination:*****
         --- End of inner exception stack trace ---

Code of Conduct

  • [X] I agree to follow this project's Code of Conduct

thinh-ngu avatar Apr 21 '24 23:04 thinh-ngu

I figured out that when using "set-session-context": true that you have to add Pooling=False at the end of your connection string.

DATABASE_CONNECTION_STRING='Server=****;Database=****;TrustServerCertificate=true;Pooling=False;

If there is an alternative solution to this , please let me know.

Could we do either any of the following as enhancement?

  1. Add to the documentation for solutions that "set-session-context": true to requests users of the DAB to add Pooling=False;
  2. Programmatically add it to a connection string if it does not exist.

thinh-ngu avatar Apr 22 '24 01:04 thinh-ngu