SP returns positive RecordsAffected value even when TSQL statement rolled back
on the C# side, the dbResponse.RecordsAffected value is always incremented.


That's just a total of the row count messages returned from SQL Server.  These are sent as queries are run, before the transaction has been committed or rolled back.


  how can I get this SP to return the correct rows effected value? 


Keep track of the row count in a variable, and return that to the client with an output parameter or a result set.


  Is it possible to reset this value in the CATCH statement?


As @Kin suggested, you can SET NOCOUNT ON and no rowcount messages will be sent to the client.  Then after you COMMIT you can turn NOCOUNT OFF and run a query to that generates the desired rowcount message. Perhaps something cheezy like:

set nocount on
--do stuff
declare @rows int = 25



set nocount off
select top (@rows) 1 a
into #bitbucket
from sys.objects o, sys.columns c